2012-05-31 128 views
31

我有2個程序,1個用於發送UDP廣播消息,1個正在監聽此廣播。我的問題是,有時當我發送廣播時,接收器會收到2條消息。爲什麼?發送UDP廣播,接收多條消息

接收器代碼:

public class Receiver { 
    private readonly UdpClient udp = new UdpClient(15000); 
    private void StartListening() 
    { 
    this.udp.BeginReceive(Receive, new object()); 
    } 
    private void Receive(IAsyncResult ar) 
    { 
    IPEndPoint ip = new IPEndPoint(IPAddress.Any, 15000); 
    byte[] bytes = udp.EndReceive(ar, ref ip); 
    string message = Encoding.ASCII.GetString(bytes); 
    StartListening(); 
    } 
} 

發件人代碼:

public class Sender { 
    public void Send() { 
    UdpClient client = new UdpClient(); 
    IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 15000); 
    byte[] bytes = Encoding.ASCII.GetBytes("Foo"); 
    client.Send(bytes, bytes.Length, ip); 
    client.Close(); 
    } 
} 
+0

嗨。我想用你的代碼來傳輸UDP文件。但我不知道如何處理接收部分!應該如何實施?它將如何開始從網絡中獲取內容? – Shamim

+0

@Shamim,網上有很多資源,有點Google搜索應該有所幫助。查找服務器/客戶端示例。 –

+0

'IPEndPoint ip = new IPEndPoint(IPAddress.Any,15000);'只能是'IPEndPoint ip = null;' - 它不是結構體。它在'EndReceive()'方法中的用途是定義發送者。用任何東西填充它都有點誤導。 – maxp

回答

26

嚴格地說,在IP網絡數據包的複製被允許的網絡行爲,你必須能夠處理在你的軟件中使用它,即使你這次會以某種方式擺脫它。如果你只是想知道爲什麼會在你的特定情況下發生這種情況......乍一看,我沒有看到你的代碼有問題。你的計算機的以太網端口上是否有多個IP地址?我認爲wireshark可能有助於獲取有關正在發生的更多細節。

+5

你的問題回答了。當我通過電纜連接時,筆記本電腦的無線設備也已打開。所以我通過有線和無線接收了這個包。謝謝。 –

6

UDP數據包不可靠,您可能會得到相同的數據包兩次甚至完全沒有數據,使用udp時,您需要在數據中包含某種唯一ID,以便丟棄錯誤或請求重新發送。