Socket编程注意接收缓冲区大小
最近在做一个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多了。
以上是思路整理,如果你也遇到这样的情况,或者对你有帮助,欢迎点赞、回复。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】