[英]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.