在c#中我使用的是UdpClient.Receive函数:
public void StartUdpListener(Object state)
{
try
{
udpServer = new UdpClient(new IPEndPoint(IPAddress.Broadcast, 1234));
}
catch (SocketException ex)
{
MessageBox.Show(ex.ErrorCode.ToString());
}
IPEndPoint remoteEndPoint = null;
receivedNotification=udpServer.Receive(ref remoteEndPoint);
...
但是我收到一个套接字异常,说该地址不可用,错误代码为10049 我该怎么做才能否定这个例外?
答案 0 :(得分:20)
以下是我目前在生产应用程序中使用的一些代码的清单(我们在那里有一些额外的东西来处理客户端是服务器应用程序在独立安装上运行的情况)。它的工作是接收消息准备好处理的udp通知。正如Adam Alexander所提到的,唯一的问题是你需要使用IPAddress.Any而不是IPAddress.Broadcast。当您想要发送广播UDP数据包时,您只能使用IPAddress.Broadcast。
设置udp客户端
this.broadcastAddress = new IPEndPoint(IPAddress.Any, 1234);
this.udpClient = new UdpClient();
this.udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
this.udpClient.ExclusiveAddressUse = false; // only if you want to send/receive on same machine.
并使用回调触发异步接收的开始。
this.udpClient.Client.Bind(this.broadcastAddress);
this.udpClient.BeginReceive(new AsyncCallback(this.ReceiveCallback), null);
希望这会有所帮助,您应该能够使其适应同步工作而不会出现太多问题。与你正在做的非常相似。如果您在此之后仍然收到错误,那么其他内容必须使用您正在尝试收听的端口。
所以,澄清一下。
IPAddress.Any =用于接收。我想听一个到达任何IP地址的数据包。 IPAddress.Broadcast =用于发送。我想把数据包发送给正在听的人。
答案 1 :(得分:5)
出于您的目的,我相信您将要使用IPAddress.Any而不是IPAddress.Broadcast。希望这有帮助!
答案 2 :(得分:0)
该错误意味着协议无法绑定到选定的IP /端口组合。
我没有使用UDP广播,但我记得你需要使用不同的IP范围。
答案 3 :(得分:0)
配置UdpClient的方式没有任何问题。你尝试过不同的端口号吗?也许1234已经在您的系统上由另一个应用程序使用。