转自:http://www.cnblogs.com/ITBread/p/3900254.html

最近在做一个udp升级程序,因文件有点大,需要将程序分成多个包发送,每次发送一个包,收到回复后发送下一个包,直到完成,这样就控制为顺序发送,保证了完整性,简单定义一个协议,每个包,包含包编号,当前数据长度等信息

包头 命令 子命令 总包数 包编号 总长度 当前包长度 校验信息 数据
6byte 1 1 1 1 4 4 2 0-1024

命令:290

子命令:发送开始为 1   发送数据为2  发送成功为3(接收端发送给发送端)  发送失败为4

总包数: 文件分成多少个包

包编号:当前发送的是第几包(索引从0开始)

总长度:文件长度

当前包长度:当前包的数据长度(《=1024)每次发送1024,最后一包可能少于1024

校验信息:用计算是否丢包用,可以用crc算法 ,这里为了简单设置为0

升级程序流程如下:

1、发送开始命令(发送端--》接收端)

2、传输数据(发送端收到接收端的第一个回复后,然后发送第一个数据包,收到第2个回复,然后发送的第3个包,如此循环,直到发送完成)

3、传输数据完成(接收端,收到所有包后,发送成功命令给发送端)

以上是处理思路,写好代码之后,测试ok,因设备太多 上1000台,一个一个人工处理,太麻烦,想批量升级,修改代码后,可以使用,一次最多5台,多了就会出现部分设备发送到一部分时就不成功。仔细检查处理流程,并没有发现任何错误,最后请同事帮忙看代码,分析也没有发现错误,抓包(Wireshark)分析后,有收到回复包,也有发送数据,但就是中断了,仔细分析后,猜测是接收缓冲区小(默认8192字节),设置接收缓冲区为32k字节后,再试,可以一次升级20多台。

查找相关资料后,是由于udp接收数据大于缓冲区时就会把数据丢掉。

分析原因:一个数据包1k多,5台接近8192,这就是为什么5台时,很顺利。

同理设置接收缓冲区为32k后,就可以升级20多了。

Socket编程注意接收缓冲区大小的更多相关文章

  1. socket tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...

  2. 修改帧大小和socket缓冲区大小(转)

    修改帧大小和socket缓冲区大小 MTU (最大传输单元)的缺省值为1500. 通过下面命令将其改为9000(jumbo frame) % ifconfig eth0 mtu 9000 socket ...

  3. socket编程(C++)

    介绍 ​ 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 过程介绍 ​ 服务器端和客户端通信过程如下所示: 服务端 ​ 服务端的过程主要在该图的左侧部分,下 ...

  4. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  5. socket编程 ------ BSD socket API

    伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...

  6. Socket编程中 setsockopt的作用

    功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值 ...

  7. 【Linux】tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...

  8. TCP中RTT的测量和RTO的计算 以及 接收缓存大小的动态调整

    RTT测量 在发送端有两种RTT的测量方法,但是因为TCP流控制是在接收端进行的,所以接收端也需要 有测量RTT的方法. /* Receiver "autotuning" code ...

  9. Python网络编程——修改套接字发送和接收的缓冲区大小

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

随机推荐

  1. 除Hadoop大数据技术外,还需了解的九大技术

    除Hadoop外的9个大数据技术: 1.Apache Flink 2.Apache Samza 3.Google Cloud Data Flow 4.StreamSets 5.Tensor Flow ...

  2. FlexPaper使用小结

    FlexPaper相关介绍及后台swf生成,参见 FlexPaper实现文档在线浏览(附源码) 前台swf在flash中的预览: 1.下载相关文档 FlexPaper Classic 2.将下载的文件 ...

  3. Intel项目所用jquery小知识点总结

    1.$("#tdGeo input[type='checkbox']:checked")   ---筛选出所有已经Check的Checkbox 2.$("#tdCount ...

  4. IN和EXISTS的详解

    从效率来看: 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<& ...

  5. sizeof进行结构体大小的判断

    typedef struct{    int a;    char b;}A_t;typedef struct{    int a;    char b;    char c;}B_t;typedef ...

  6. ACM/ICPC 之 快排+归并排序-记录顺序对(TSH OJ-LightHouse(灯塔))

    TsingHua OJ 上不能使用<algorithm>头文件,因此需要手写快排(刚开始写的时候自己就出了很多问题....),另外本题需要在给横坐标排序后,需要记录纵坐标的顺序对的数量,因 ...

  7. 18. javacript高级程序设计-JavaScript与XML

    1. JavaScript与XML IE采取了下列方式: l 通过ActiveX对象来支持处理XML,而相同的对象也可以用来构建桌面应用程序 l Windows携带了MSXML库,JavaScript ...

  8. effective OC2.0 52阅读笔记(二 对象、消息、运行期)

    第二章:对象.消息.运行期 6 理解属性这一概念 总结:OC解决硬编码偏移量问题的做法,一种方案是把实例变量当做一种存储偏移量所用的特殊变量,交由类对象保管,偏移量会在运行期查找,叫做稳固的“应用程序 ...

  9. C++库(TinyXML)

    C++库(TinyXML) 什么是XML? "当 XML(扩展标记语言)于 1998 年 2 月被引入软件工业界时,它给整个行业带来了一场风暴.有史以来第一次,这个世界拥有了一种用来结构化文 ...

  10. jquery的基本事件大全

    ].name); });jQuery.getScript( url, [callback] ) 使用GET请求javascript文件并执行. $.getScript(”test.js”, funct ...