UdpClient在广播地址上接收

14

在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,显示地址不可用。我该怎么做才能消除这个异常呢?

4个回答

24

以下是我当前在生产应用中使用的一些代码要点(我们还添加了一些额外的内容,以处理客户端和服务器应用程序在独立安装上运行的情况)。其作用是接收 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 = 用于发送。我想向任何正在侦听的人发送数据包。


5

针对您的需求,我认为您应该使用IPAddress.Any而不是IPAddress.Broadcast。希望这能帮到您!


0

这个错误意味着协议无法绑定到所选的IP/端口组合。

我已经很久没有使用UDP广播了,但我记得你需要使用不同的IP范围。


0

你配置UdpClient的方式没有问题。你尝试过使用不同的端口号吗?也许1234端口已经被系统中的其他应用程序占用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接