2011-06-07 71 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方法的端点中的所有数据。