udp丢包缘由分析及总结

 (20udp丢包缘由分析及总结 一、调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种状况能够修改接收端,将包接收后存入一个缓冲区,而后迅速返回继续recv。 二、发送的包巨大丢包。虽然send方法会帮你作大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接经过send方法发送也会致使这个包丢失。这种状况须要切割成小包再逐个send。 三、发送的包较大,超过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 四、发送的包频率太快,虽然每一个包的大小都小于mtu size 可是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能致使丢包。这种状况也有时能够经过设置socket接收缓冲解决,但有时解决不了。 五、局域网内不丢包,公网上丢包。这个问题我也是经过切割小包并sleep发送解决的。若是流量太大,这个办法也不灵了。总之udp丢包老是会有的,若是出现了用个人方法解决不了,还有这个几个方法: 要么减少流量,要么换tcp协议传输,要么作丢包重传的工做。