簡體   English   中英

C# UDP 套接字綁定異常

[英]C# UDP Socket Bind Exception

我正在嘗試為無線網狀網絡創建一個程序(除名稱外都是臨時的)。 大多數網絡將處理 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 Windows Socket Error Codes 這是一個無效的參數,但我對這意味着什么感到困惑,因為所需的參數是一個端點。

這在第一次運行時失敗,所以這不像我試圖重新綁定端口。

我同意史蒂夫。 但是,您聲明

“UDP 不允許綁定或其他東西。”

但確實如此。 您可以將任何套接字(udp 與否)綁定到任何網絡接口。 史蒂夫給出了實現它的提示。 這就是我的做法:

LocalEP = new IPEndPoint(<local IP>, _PORTRECEIVE) ;
listener = New UdpClient(LocalEP) ;

正如史蒂夫指出的那樣,一旦 UdpClient 被實例化,它就不允許重新綁定到另一個接口。 訣竅是告訴構造函數事先綁定到你想要的接口。 替換為您要使用的本地接口的 IP 地址。

當然,這僅在您擁有(或可能擁有)多個網絡接口並希望使用特定的網絡接口時才有用。 否則,我已經看到帶有有效網關的接口通常是客戶端默認綁定的接口。 這通常是正確的。

羅伯托

在構建端口時,您已經將端口綁定到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 ,然后使用它而不是端口構建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 如果您嘗試使用它,這可能會導致問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM