【问题标题】:UDP Client receives only 1 messageUDP 客户端仅收到 1 条消息
【发布时间】:2011-08-14 23:39:34
【问题描述】:

我目前正在开发一个服务器客户端应用程序。服务器通过 WAN 正常接收数据,客户端似乎接收到数据,但客户端只接收一次通信。 WAN上是否有任何东西会使客户端始终只接收第一个返回的UDP通信而没有后续的。谢谢您的帮助。

客户端 UDP 监听代码

private void receiveUDP()
    {
        System.Net.IPEndPoint test = new System.Net.IPEndPoint(System.Net.IPAddress.Any,UDP_PORT_NUMBER);
        System.Net.EndPoint serverIP = (System.Net.EndPoint)test;
        server.Bind(serverIP);
        //server.Ttl = 50;

        EndPoint RemoteServ = (EndPoint)listenUDP;
        do
        {
            byte[] content = new byte[1024];
            int data = server.ReceiveFrom(content, ref RemoteServ);

            string message = Encoding.ASCII.GetString(content);


            ProcessCommands(message);


        } while (true);
    }

【问题讨论】:

  • 很难说。你能发布你的客户端程序的代码吗?
  • @Hunter McMillen 已编辑以包含客户端监听代码。如果您需要查看更多内容,请告诉我,我会发布更多内容。
  • 这是设计使然。发送器和接收器之间的许多机器中的任何一个都可以在没有诊断的情况下丢弃数据包。不可能找出谁和为什么。如果无法处理,请使用 TCP。
  • 您是否验证过服务器在第一个数据包之后确实发送了一些数据?你能用 Wireshark 或类似的工具看看网络上发生了什么吗?
  • 好的......你写的一切都说它应该工作并且除了丢失的数据之外没有其他症状......不包括理论选项(给出的信息的一些微妙部分不准确)这个意味着我们在这里遗漏了一些重要信息(代码和/或错误消息和/或一些 Wireshark 诊断的异常),或者只是 UDP 在您的特定网络配置中由于某种原因不可靠(即被某些防火墙阻止) )

标签: c# sockets network-programming udp wan


【解决方案1】:

这有点摸不着头脑(因为您没有提供足够的代码来真正确切地说明发生了什么),但是您可能始终看到某些 UDP 数据报未通过 WAN 传送的主要原因有一个,而其他人总是成功到达。这个原因就是MTU; Maximum Transmission Unit 可以在单个 UDP 数据报中发送。这很容易产生诸如您所看到的行为(例如),您的第一个数据报是一个简短的“我接受您的连接”消息,然后您使用包含大文件的数据报跟随它;第一个(小)数据报小于 MTU 并被传递,而随后的(大)数据报大于 MTU,并在途中被丢弃。

对于 WAN 上的 UDP,MTU 不会高于大约 1500 字节,并且在许多情况下可能低至 1200 字节。任何大于该值的数据包都将在端点之间的某处静默丢弃。要通过 UDP 发送大数据块,您需要将它们分割成比您传输它们的网段的 MTU 更小的片段。

在 LAN 上,您通常可以发送任意大小的数据报。但是,一旦它们通过 Internet 或其他方式通过异构网络发送,它们很可能会被默默地丢弃。

如果您确实需要发送大文件,您可以选择通过 TCP 传输它们; TCP 自动管理切分数据以适应 MTU,并确保其数据包全部被接收,并按顺序接收;保证您不会收到通过 UDP 发送的数据报。

正如我上面提到的,这完全是在黑暗中刺伤,实际上可能与您的实际麻烦无关。但这是房间里的大象,我们要做的就是第一个数据包总是成功到达,而后面的数据包永远不会。

【讨论】:

  • 我不认为这是问题所在。我发送的所有数据包的大小都大致相同。但我会检查一下。至于代码是否有助于在此处查看更多信息,是指向我发布的上一个问题的链接,其中包含我的服务器的大部分连接特定代码:*.com/questions/7018796/…
  • @Stephen 你解决了你的问题吗?
  • @NeilBarnwell 我最终确实做到了。我最终问了另一个关于基本相同主题的问题,并且能够解决我的问题。这是我提出的问题的链接:*.com/questions/7020996/… 如果您也想解决这个问题,请阅读 cmets 和该问题的答案。