UDP - 发送组播消息并监听响应会导致SocketException异常

3
我正在发送一个UDP组播消息来查找网络上的某些设备。然后我在5001端口上监听响应。
我的工作流程如下:
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;
}

**更新**

我尝试了多种代码结构方式,似乎问题与在不同的UdpClients上发送和接收有关。我的异常是由于在打开一个用于发送的UdpClient后立即创建一个用于接收的UdpClient - 在发送和接收之间添加延迟可以解决此问题。

我已更改代码,使用相同的UdpClient进行发送和接收,但仍未在接收端收到任何内容。


显然,端口5001已经绑定了一个套接字。这可能是一个已在运行的应用程序,或者是您自己的代码。请仔细检查您是否将多个套接字绑定到同一端口,并尝试使用不同的端口。 - dtb
我可能错过了一些显而易见的东西,但我相当确定那不是问题所在。我没有将任何其他内容绑定到端口5001,并且该代码在XP上运行正常。我还尝试在一个“干净”的Windows 7机器上运行,但没有成功。 - Matt Roberts
实际上,异常抛出的地方不是那里,而是异常被捕获的地方!异常在那之前就被抛出了,可能是由于对UdpClient构造函数的调用,或者是由于对BeginReceive的调用。你能告诉我们是哪个吗? - Jim Mischel
发送组播的程序在哪台机器上运行? - Jim Mischel
抱歉 - 异常注释有愚蠢的错误!它在调用UdpClient构造函数时抛出。奇怪的是,如果我从开头逐步执行程序并“F10”该构造函数调用,则不会抛出异常...多播是从我的机器(win 7)发送的。 - Matt Roberts
1个回答

2

已排序!这是因为我的Sendpacket使用了"udpclient.connect",这会限制接收到连接方法提供的端点中的所有数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接