UDP客户端只收到1条消息

时间:2011-08-14 23:39:34

标签: c# sockets network-programming udp wan

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

1 个答案:

答案 0 :(得分:1)

这在黑暗中有点刺痛(因为你没有提供足够的代码来真正说出最终会发生什么),但是有一个主要原因可能导致你不断看到一些UDP数据报无法通过WAN传送,而其他人总是成功到达。这个原因是MTU;可以在单个UDP数据报中发送的Maximum Transmission Unit。如果(例如),您的第一个数据报是一个简短的“我接受您的连接”消息,然后您使用包含大文件的数据报,那么这很容易产生行为,例如您所看到的行为;第一个(小)数据报小于MTU并被传送,而以下(大)数据报大于MTU,并在途中被丢弃。

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

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

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

正如我上面提到的,这是在黑暗中完全刺伤,实际上可能与你的实际麻烦无关。但它是房间里的大象,当我们所有必须继续的时候,第一个数据包总是成功到达,后来的数据包永远不会。但/ p>