2011-08-14 36 views
0

我有一个目前正在处理的服务器客户端应用程序。服务器通过广域网接收数据并且客户端似乎接收数据,但客户端只接收一个通信。广域网上有什么东西可以使客户端始终只接收到第一个返回的UDP通信,而不是后续的任何一个。谢谢您的帮助。UDP客户端只收到1条消息

客户端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); 
    } 
+0

很难说。你可以发布你的客户端程序的代码吗? –

+0

@Hunter McMillen编辑包括客户的听音代码。如果您需要了解更多,请告诉我,我会发布更多信息。 – Stephen

+0

listenUDP定义在哪里? – iandotkelly

回答

1

这是一个位在黑暗中刺中(因为您没有提供足够的代码真的说什么明确回事),但有一个主要的原因为什么你可能会一直看到一些UDP数据报不能通过广域网传送,而其他的则始终能够成功到达。这个原因是MTU; Maximum Transmission Unit可以在单个UDP数据报中发送。如果(例如)你的第一个数据报是一个简短的“我接受你的连接”消息,然后你使用包含大文件的数据报,那么这很容易产生行为,第一个(小的)数据报比MTU小并且被传送,而下面的(大)数据报大于MTU,并且在途中被丢弃。

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

在局域网上,你通常可以发送任意大小的数据报。但只要它们通过互联网或其他途径通过异构网络发送,它们很可能会被无声地丢弃。

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

正如我上面提到的,这是一个在黑暗中的完整刺,可能实际上并不涉及到你的实际麻烦。但它是房间里的大象,当我们不得不继续说的时候,第一个数据包总是成功到达,而后来的数据包从来不会这样做。

+0

我不认为这是问题。我发送的所有数据包大小几乎相同。但我会检查它。至于代码,如果这将有助于看到更多这里是一个链接到我发布的以前的问题,具有我的服务器的大部分连接特定代码:http://stackoverflow.com/questions/7018796/tcp-udp -socket-server-on-wan – Stephen

+0

@Stephen你解决了你的问题吗? –

+0

@NeilBarnwell我最终确实做到了。我最终提出了另一个关于基本相同主题的问题,并能够解决我的问题。这里是我问到的问题的链接:http://stackoverflow.com/questions/7020996/tcp-and-udp-socket-server-on-a-wan如果你正在尝试解决这个问题,也请阅读评论以及关于这个问题的答案。 – Stephen

相关问题