12

在 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

4 回答 4

22

这是我目前在一个可以运行的生产应用程序中使用的一些代码的概要(我们有一些额外的内容来处理客户端是服务器应用程序在独立安装上运行的情况)。它的工作是接收消息已准备好处理的 udp 通知。正如亚当亚历山大所提到的,您唯一的问题是您需要使用 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 = 用于发送。我想向正在收听的任何人发送一个数据包。

于 2009-04-17T08:53:18.947 回答
5

出于您的目的,我相信您会想要使用 IPAddress.Any 而不是 IPAddress.Broadcast。希望这可以帮助!

于 2009-04-14T06:28:21.867 回答
0

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

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

于 2009-04-14T06:30:17.243 回答
0

您配置 UdpClient 的方式没有任何问题。您是否尝试过不同的端口号?可能 1234 已在您的系统上被其他应用程序使用。

于 2009-04-14T06:31:22.123 回答