2011-08-14 47 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

相關問題