C#UDP套接字绑定异常

C#UDP套接字绑定异常,c#,.net,sockets,udpclient,mesh-network,C#,.net,Sockets,Udpclient,Mesh Network,我正在尝试为无线网格创建一个程序(除了名称之外,其他都是临时的)。大部分网络都将处理TCP消息传递,但为了确定所有邻居IP(因为它们在启动时是未知的),我选择使用UDP广播作为初始发现消息。这段代码在很大程度上是不相关的,因为最初的测试似乎是可行的,目前我不称之为 以下是接收和注册邻居IP的部分 protected override void ReceiveMessageUDP() { while (live) { try

我正在尝试为无线网格创建一个程序(除了名称之外,其他都是临时的)。大部分网络都将处理TCP消息传递,但为了确定所有邻居IP(因为它们在启动时是未知的),我选择使用UDP广播作为初始发现消息。这段代码在很大程度上是不相关的,因为最初的测试似乎是可行的,目前我不称之为

以下是接收和注册邻居IP的部分

protected override void ReceiveMessageUDP()
    {
        while (live)
        {
            try
            {
                UdpListener = new UdpClient(_PORTRECEIVE);
                UdpListener.EnableBroadcast = true;
                Socket socket = UdpListener.Client;
                IPEndPoint endPoint1 = new IPEndPoint(IPAddress.Loopback, _PORTRECEIVE);
                IPEndPoint endPoint2 = new IPEndPoint(IPAddress.Any, _PORTRECEIVE);
                socket.Bind(endPoint2);
                socket.Listen(25);
                Socket connected = socket.Accept();
                byte[] buffer = new byte[1024];
                int length = connected.Receive(buffer);

                IPAddress remoteIP = ((IPEndPoint)connected.RemoteEndPoint).Address;
                if (!ipAddresses.Contains(remoteIP))
                    ipAddresses.Add(remoteIP);

                Message.Add(Encoding.ASCII.GetString(buffer, 0, length));
            }
            catch (SocketException e) { Console.WriteLine(e.ErrorCode); }
            catch (Exception) { }
        }
    }
我已经用这两个IPEndPoints进行了测试,无论我如何设置它,绑定都会失败,SocketException.ErrorCode 10022。这是一个无效的参数,但我不清楚这意味着什么,因为所需的参数是一个端点


这在第一次运行时失败,因此我不会尝试重新绑定端口。

在构建该端口时,您已经将该端口绑定到了
UdpCLient
。然后不能将同一端口绑定到单独的
IPEndPoint

UdpListener = new UdpClient(_PORTRECEIVE);  // binds port to UDP client
...
IPEndPoint endPoint2 = new IPEndPoint(IPAddress.Any, _PORTRECEIVE);
socket.Bind(endPoint2);  // attempts to bind same port to end point
IPEndPoint endPoint2 = new IPEndPoint(IPAddress.Any, _PORTRECEIVE);
socket.Bind(endPoint2);  // bind port to end point

UdpListener = new UdpClient(endPoint2);  // binds port to UDP client via endpoint
如果要这样做,请构建并绑定
IPEndPoint
,然后用它而不是端口构建
UdpClient

IPEndPoint endPoint2 = new IPEndPoint(IPAddress.Any, _PORTRECEIVE);
socket.Bind(endPoint2);  // bind port to end point

UdpListener = new UdpClient(endPoint2);  // binds port to UDP client via endpoint

我不确定您为什么还要在同一端口上设置另一个端点
endPoint1
。如果您尝试使用此功能,可能会导致后续问题。

我同意steve的观点。但是你说,

“UDP不允许绑定或其他内容。”

但确实如此。您可以将任何套接字(udp或非udp)绑定到任何网络接口。史蒂夫暗示要实现这一目标。我就是这样做的:

LocalEP = new IPEndPoint(<local IP>, _PORTRECEIVE) ;
listener = New UdpClient(LocalEP) ;
LocalEP=new-IPEndPoint(,_-PORTRECEIVE);
侦听器=新的UdpClient(LocalEP);
正如steve指出的,一旦UdpClient被实例化,它就不允许重新绑定到另一个接口。诀窍是告诉构造函数事先绑定到所需的de接口。替换为要使用的本地接口的IP地址

当然,只有当您有(或可能有)多个网络接口并且想要使用特定的网络接口时,这才有用。否则,我已经看到,具有有效的internet网关的接口通常是客户端默认绑定到的接口。这通常是正确的


Roberto

我95%不熟悉TCP/UDP/Socket,所以我已经瞎飞了大约两个星期才弄明白这一点。使用端点创建UdpClient后,我将套接字绑定到辅助端点?上面的逻辑(我的版本)将套接字绑定到该端点,然后在端点上设置客户端-套接字在该点仍然绑定。您还可以使用端口id=0,系统将使用任何可用的本地端口,在
endPoint1
上,该选项可能会更容易使用。看看MSDN上的示例代码——这里有大量的示例可以帮助您解决这个问题。看看这里的一般TCP/UDP启动器信息——我在测试时创建了大量这样的变量——只是在最后给它们不同的数字,以便在测试时快速选择。至于程序-我根据您的建议对其进行了更改,先尝试第一个,然后尝试第二个,最后使用0作为UdpClient的端口。我收到了与套接字相同的错误代码。请重新绑定。我发现,UDP不允许绑定或其他内容。@Scott S-很高兴听到您在这方面已经渡过了难关。如果您想从特定端口发送,即使您绑定到IPAddress.Any,也很有用。