码迷,mamicode.com
首页 > 其他好文 > 详细

嵌入式开发之UDP 丢包--- UDP 丢包控制方法

时间:2017-12-14 22:08:46      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:丢失   blog   ref   sdn   切割   detail   中间   修改   缓冲区   

0. 发送端可以,发送五次左右,再Sleep

1、调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。

 

2、发送的包巨大丢包。虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。

 

3、发送的包较大,超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

具体设置代码可以参考下面链接:
http://blog.sina.com.cn/s/blog_a459dcf5010153mp.html

 

4、发送的包频率太快,虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况也有时可以通过设置socket接收缓冲解决,但有时解决不了。


5、局域网内不丢包,公网上丢包。这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。
总之udp丢包总是会有的,如果出现了用我的方法解决不了

 

http://ask.csdn.net/questions/257808

http://blog.csdn.net/lyq19870515/article/details/8008612

http://blog.csdn.net/ggxxkkll/article/details/7894112

http://blog.csdn.net/xingzheouc/article/details/49946191

http://blog.sina.com.cn/s/blog_a459dcf5010153nd.html

嵌入式开发之UDP 丢包--- UDP 丢包控制方法

标签:丢失   blog   ref   sdn   切割   detail   中间   修改   缓冲区   

原文地址:http://www.cnblogs.com/pengkunfan/p/8040212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!