2011-07-14 109 views
2

我正試圖在局域網上測試UDP通信。我有一小段代碼,我試圖在兩臺電腦上運行它(一個應該等待接收,另一個應該發送)。奇怪的是,計算機A發送和B正確接收,但如果我嘗試A接收和B發送它不起作用。你知道爲什麼會這樣嗎?在.NET中發送和接收UDP數據包

public void SendBroadcast(int port, string message) 
    { 
     UdpClient client = new UdpClient(); 
     byte[] packet = Encoding.ASCII.GetBytes(message); 

     try 
     { 
      client.Send(packet, packet.Length, IPAddress.Broadcast.ToString(), port); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

public void Receive(int port) 
    { 
     UdpClient client = null; 

     try 
     { 
      client = new UdpClient(port); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     IPEndPoint server = new IPEndPoint(IPAddress.Any, 0); 


     while (true) 
     { 
      try 
      { 
       byte[] packet = client.Receive(ref server); 
       Console.WriteLine("{0}, {1}", server, Encoding.ASCII.GetString(packet)); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 

而且電話:

SendBroadcast(444, "hello"); Receive(444); 

如果我能夠正常工作而造成每次通話3個封裝在同一臺計算機上運行的程序的兩個實例。

在此先感謝。

+0

是否明確指定IP地址並且不依賴廣播使這項工作在兩個方向上都可行? – Tremmors

回答

1

好吧,如果相同的代碼在一個而不是另一個上工作,那就是你的環境。檢查您的防火牆設置,確保它不阻止發送方的廣播或防止接收方收到。 Wireshark(甚至Windows的netmon)在這裏應該會有所幫助。

+0

是的,這是問題...謝謝! – Reixons

2

嘗試使用異步方法,以便您可以在不阻止發送消息的情況下持續監聽消息。

+0

你能否詳細說明一下異步方法。任何可用的鏈接?謝謝 – WEFX

+0

[這是MSDN文檔的鏈接](http://msdn.microsoft.com/en-us/library/9wkb9k12.aspx)。查找以「開始」和「結束」開頭的方法。這裏有很多例子可以找到。 – Jay

0

這兩個系統之間有什麼網絡設備?

這兩個系統在同一個子網上有相同的子網掩碼嗎?

IPV4網絡有一個有趣的事情;你可以有多個broadcast addresses。您可以廣播到本地網絡或本地子網。這些是明顯不同的地址,如果一個系統的IP設置不同,它可能沒有意識到它應該監聽這個本地子網廣播。

事情嘗試:

  1. 確保IPv6是兩端禁用(IPV6不支持廣播地址,但讓剛剛建立一個基準)。
  2. 顯式設置程序中的IP地址,它工作嗎?我的猜測是肯定的,所以我們必須確定原因。
  3. 加載wireshark並嗅探數據包。看看他們是否一直到遠程主機,而他只是無視它們。
-1

當試圖異步執行此操作時,Microsoft會忽略告訴用戶創建自己的部分類,如下所示。非常簡單,但沒有這個,可能很難通讀他們的例子。

private partial class UdpState 
{ 
    public UdpClient u; 
    public IPEndPoint e; 
}