在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,该怎么办否定这个异常?
以下是我目前在生产应用程序中使用的一些代码的写法(我们在那里有一些额外的东西来处理客户端是服务器应用程序在独立安装上运行的情况).它的工作是接收消息准备好处理的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 =用于发送.我想向正在收听的人发送数据包.
为了您的目的,我相信您将要使用IPAddress.Any而不是IPAddress.Broadcast.希望这可以帮助!