机器A, B 在局域网内
udp server s1 和程序a 在机器 A 上
程序b 在机器B 上
a 发数据 --> s1
s1 把收到的数据 --> b
也就是 s1 是中转
数据都是放在队列中,偶的同步不怎么好,a,b,s1都是从队列里取到数据就处理,这样可能有数据丢失
本来是 B上数据丢失很多,
偶然的偶在A上打开了sniffer,发现B收到的数据基本很完整了,很少丢失,哈哈,真是晕啊
偶想是不是本来发的太快了,打开sniffer 后发的慢了,b 的速度就跟上了
各位发表下自己的看法,不胜感激!

解决方案 »

  1.   

    1.把服务器端和客户端的socket recv buffer(SO_RCVBUF) 缓冲区改大一点。如果服务器端socket recv buffer不够大的情况下可能会丢包。
       另外如果发送端发送数据过快,接收端接收数据慢(可能正在处理其他数据)。接受缓冲区满后
    udp是会直接将后来的数据丢弃的,因为udp不使用滑动窗口来协调双方发送和接受速度。
       这样只能缓解丢包率(检查一下客户端机器是否比服务器端快,另外服务器的编写方式不好也可能造成没有及时从socket 缓冲区接收数据,导致缓冲区满)   2.也有可能是一小部分数据包在客户端,就被丢弃了;或者被服务器端的网络接口卡丢弃了。   3.总之,局域网之内发生很小的丢包率是正常的。丢包后需要客户端重新发送数据
      

  2.   

    打开sniffer后,可能机器a上的ip分组发送速度要慢了一点。另外udp丢包主要和网络是否繁忙,socket recv缓冲区,客户端和服务器端的处理速度,网络接口卡接受队列,还有你的udp数据包大小(一般小于512字节)都有关系。还是因为udp没有协调双方发送和接收速度的机制