现阶段问题:丢包问题 丢包率达到50%,但是ping的时候反应良好
1. 分析UDP丢包的原因:
1)现象是每隔一个包丢失一个,所以考虑是否是缓冲区的问题
答:用不同数据包大小10、100、500、1500发现都是收一个丢一个,说明缓冲区大小并不是直接因素。因为如果缓冲区大小有影响,那应该是收几个丢一个会变化
2) 调用recvfrom方法接收到数据后,处理数据花费时间太长,再次调用recvfrom,两次调用间隔里,发过来的包可能丢失。
答: 将recvfrom后面的语句精简,还是一样的丢包率,所以感觉后面的语句好像也没有太多的影响
通过将接收到数据存入一个缓冲区,并迅速返回继续recvfrom,排除了这个原因
找到原因:小循环中数目是几,就是隔几个包丢一个包 这个是因为什么呢?
解决:发现是for循环里的问题,每次encode的时候有一个i++,小循环跳出后又空加一个i++,所以出现了每个小循环后必丢包的现象。
2.接收端速率严重下滑的原因确定
1)在发送端速率19M的时候,接收端速率最高只有9M,在本机上实验,发现是每次的输出影响,包数量过多的情况下,会严重影响接收速率。
学到的一些技巧
1.设置UDP的发送和接收缓冲区
在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节