2014-10-17 37 views
1

我嘗試從UDP單播客戶端接收六條消息。 Receiver看起來像:C#。 UDP單播

UdpClient udpclient = new UdpClient(); 
IPEndPoint localEp = new IPEndPoint(IPAddress.Parse(ClientIP), ClientPort); 
udpclient.Client.Bind(localEp); 
udpclient.Client.ReceiveTimeout = 10000; 
bool isTimeExpired = false; 
while (!isTimeExpired) 
{ 
    byte[] buffer; 
    try 
    { 
     buffer = udpclient.Receive(ref localEp); 

    } 
    catch (SocketException) 
    { 
     isTimeExpired = true; 
     continue; 
    } 
    // Deserialize 
    // ... 
} 
udpclient.Close(); 

程序工作,但有時我沒有收到6條消息(2或3)。發件人應用程序:

UdpClient client = new UdpClient(); 

IPEndPoint remoteep = new IPEndPoint(IPAddress.Parse(ClientIP), ClientPort); 

// Serialize 
// ... 

stream.Position = 0; 
byte[] data = new Byte[stream.Length]; 
stream.Read(data, 0, Convert.ToInt32(stream.Length)); 
client.Send(data, data.Length, remoteep); 
stream.Close(); 
client.Close(); 

我在同一臺機器(和一個接收器實例)上運行6個發件人應用程序實例。我需要始終接收來自每個發件人的郵件(總共6封郵件)。我的錯誤在哪裏?

非常感謝!

回答

2

它是UDP。不保證你會收到發送的數據報的任何。 UDP在設計上不可靠。相反,UDP中的「用戶」也可能代表「不可靠」。 :)

供參考:也不能保證你會收到任何發送的任何給定的數據報的副本。也不能保證數據報將以它們發送的相同順序到達。如果你需要這種可靠性,那麼你需要TCP而不是UDP(或者你需要做一堆額外的工作來重新發明TCP盤)。如果你需要這種可靠性,那麼你需要TCP而不是UDP(或者你需要做一堆額外的工作來重新發明TCP盤)。

+0

彼得Duniho,我知道UDP不保證傳遞。我想可能是我需要把'Thread.Sleep(1000);'放在某處。因爲當我在我的電腦上運行這個程序時,我收到全部6條消息。當我在筆記本電腦上運行它們時,我大部分都收不到所有消息(接收2或3,有時爲0)。但是,謝謝! – user3649515 2014-10-17 21:49:02

+0

這很可能是因爲您可以做某些事情來提高該計算機上網絡堆棧的可靠性。但最終,您的代碼需要具有足夠的彈性來處理丟失的數據報。在這方面,該計算機上的故障率較高可能是件好事,因爲它爲您提供了一個更好的測試環境,以確保您正確編寫了UDP處理。 :) – 2014-10-17 23:23:03

+0

Peter Duniho,好的,謝謝! – user3649515 2014-10-18 07:43:57