2011-06-07 43 views
3

我正在發送一個UDP多播消息來查找網絡上的某些設備。然後我偵聽端口的響應5001UDP - 發送多播消息並偵聽響應給出SocketException

我的工作流程如下:

  1. 發送組播「發現」的消息對本地子網。
  2. 上,我希望有一個信息包中的網絡響應的任何wiznet設備接收

這一切都可以在Windows XP很好,但在Windows 7上,我得到的類型SocketException的異常:*

每個套接字地址(協議/網絡地址/端口)的一個使用通常被允許

我可以看到多播消息在Wireshark中出現,我看到設備的響應,但是我的代碼沒有響應。我的代碼如下所示:

public void StartListen() 
    { 
     SendFind(); 
     try { 
      IPEndPoint localEp = new IPEndPoint(IPAddress.Any, 0); 
      UdpClient listenClient = new UdpClient(5001); 

      UdpState s = new UdpState(); 
      s.endpoint = localEp; 
      s.client = listenClient; 

      //allow time for the find to work - aka clutching at straws 
      Thread.Sleep(500); 

      while (listenClient.Available > 0) 
      { 
       listenClient.BeginReceive(ReceiveCallback, s); 
       Thread.Sleep(500); 
      } 
     } 

     catch (SocketException e) 
     { 
      Trace.WriteLine("Could not bind to socket on " + _localPort); 
     } 

     listenClient.Close(); 
    } 

..和RecieveCallBack ..

private void ReceiveCallback(IAsyncResult ar) 
{ 
    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).client; 
    IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).endpoint; 
    Byte[] receiveBytes = u.EndReceive(ar, ref e); 
    rxByteList.Add(receiveBytes); 
    messageRxed = true; 
} 

**更新**

所以我已經試過結構的各種方式的代碼。看來這個問題與在不同的UdpClient上發送和接收有關。我的例外是由於創建一個UdpClient在打開發送之後立即收到 - 在發送和接收之間添加一個延遲來解決這個問題。

我已經改變了我的代碼使用相同的UdpClient發送和接收,但我仍然沒有得到任何東西的接收。

+0

顯然已經有一個綁定到端口5001的套接字。這可能是一個已經運行的應用程序,或者您自己的代碼。仔細檢查你是不是將多個套接字綁定到同一個端口,然後嘗試是否有其他端口工作。 – dtb 2011-06-07 09:31:51

+0

我可能會錯過某些明顯的東西,但我相當肯定這不是問題。我沒有其他任何綁定到端口5001,並且代碼在xp上工作。也有嘗試過這樣的「乾淨」的Windows 7機器沒有喜悅 – 2011-06-07 09:38:19

+0

實際上,這並不是拋出異常的地方,而是發生異常的地方!在此之前拋出異常,可能是通過調用「UdpClient」構造函數,或者調用「BeginReceive」。你能告訴我們哪個? – 2011-06-07 09:40:04

回答

2

Sorted!這是因爲我的Sendpacket使用「udpclient.connect」,它將接收限制爲提供給connect方法的端點中的所有數據。