【问题标题】:UDP data not read correctly (delayed)UDP 数据未正确读取(延迟)
【发布时间】:2011-07-28 07:27:48
【问题描述】:

我有一个在 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)

【问题讨论】:

  • 我猜这不是字节序问题,是吗?
  • 看起来不像,因为大约 20 秒后数据正确......而在 Wireshark 中,数据一直都是正确的......非常奇怪。
  • 另一个提示可能是......在我关闭服务器后......客户端仍然会收到一段时间的UDP数据包:D
  • @todda 可能是套接字问题,所以是 Windows 的问题
  • 会不会是其他应用程序巧合地在同一端口上发送广播数据包?您可以尝试在不同的端口发送/接收以检查...

标签: wireshark c++ udp sockets


【解决方案1】:

在这里猜测一下。

我无法想象您的 UDP 数据包会在某个地方徘徊 20 秒。毕竟,全球公共互联网上的 RTT 通常比这少 40 倍。所以我认为你只是不断地重新发送你的数据,直到你得到预期的响应。

如果我的假设是正确的,那么您看到的是正常的 UDP 数据包丢失。那台笔记本电脑有无线连接吗?客户端应用程序是否会阻止某些输入?

也在笔记本电脑上运行wireshark。您是否看到与发送方(服务器)端相同数量和顺序的数据包?如果是这样,那么客户端消耗这些数据包的速度不够快。如果你真的看到客户端上的数据包有 20 秒的延迟,那么你真的必须描述更多的设置来解释魔法:)

【讨论】:

    【解决方案2】:

    感谢您的回答.. 问题是 sendto 方法在笔记本电脑上的行为与台式机不同。 在 laptot sendto 上发送 3 个 UDP 数据包,在 destop 上只有一个。 我的应用程序只需要一个数据包,因此处理时间 + 乘以 3 给人的印象是延迟。 我不明白为什么会发生这种情况,但这就是问题所在。

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2020-12-17
      • 2011-10-21
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多