0

我有一个我目前正在处理的服务器客户端应用程序。服务器通过 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);
    }
4

1 回答 1

1

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

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

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

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

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

于 2011-08-15T03:03:51.687 回答