UDP数据未正确读取(延迟)

时间:2011-07-28 07:27:48

标签: wireshark c++ udp sockets

我在Windows 7桌面PC上运行服务器,在Windows XP Lenovo笔记本电脑上运行客户端。

以下内容在循环中发生:

  • 客户端正在广播包含一些ID信息的UDP数据包。
  • 服务器获取广播并回复另一个包含内部数据的UDP数据包。

我在Wireshark中可以看到服务器正在发送正确的数据,但RECVFROM函数正在返回其他一些数据。大约20-30秒后,数据最终被正确读取。

如果我在桌面上同时运行服务器和客户端,它可以正常工作。有任何想法吗?


相关的代码:

do
    {
       result=recvfrom(_socket,buff,buffLen,0,(SOCKADDR*)&SenderAddr,&SenderAddrSize);
       if(result != SOCKET_ERROR)
       {
          //small processing
          .....
         ////
         sendto(_socket,buff,16,0,(SOCKADDR*)&SenderAddr,sizeof(SenderAddr));
       } 
    while(true)

2 个答案:

答案 0 :(得分:0)

在这里稍作猜测。

我无法想象您的UDP数据包在某处出现了20秒。在全球范围内通过公共互联网进行的RTT通常比那时少40倍。因此,我认为您只是不断重新发送数据,直到获得预期的响应。

如果我对我的假设是对的,那么你看到的是正常的UDP 丢包。这台笔记本电脑是否在无线链接上?客户端应用程序是否会阻止某些输入?

在笔记本电脑上也运行wireshark。您是否看到与发送方(服务器)端相同的数据包和序列?如果是这样,那么客户端就不会足够快地使用这些数据包。如果您实际上在20秒的延迟时间内看到客户端上的数据包,那么您真的需要描述更多的设置以解释这些魔法:)

答案 1 :(得分:0)

感谢您的回答.. 问题是sendto方法在笔记本电脑上的表现与桌面相比有所不同。 在laptot sendto发送3个UDP数据包,在destop上只有一个。 我的应用程序只期望一个数据包,因此处理时间+乘以3会给人一种延迟的印象。 我不明白为什么会这样,但这就是问题。