UdpClient不会连接到IpAdress.Any

时间:2019-04-18 16:56:18

标签: c# network-programming

我正在尝试侦听来自未知来源的UDP数据包。但是不能绑定“未指定地址”(0.0.0.0或::)

我已经尝试收听:: 1。但是从我测试的结果来看,它仅适用于不通过网络接口的本地连接。

        public async void AwaitDiscoveryReply()
        {
            try
            {
                using (var client = new UdpClient(AddressFamily.InterNetworkV6))
                {
                    client.Connect(IPAddress.IPv6Any,4568);

                        var result = await client.ReceiveAsync();
                        Debug.WriteLine("Received DR");
                        var stateProtocol = StateProtocol.FromBytes(result.Buffer);
                        var robeatsDevice = new RobeatsDevice
                        {
                            Id = stateProtocol.DeviceId,
                            Name = stateProtocol.DeviceName,
                            EndPoint = client.Client.RemoteEndPoint,
                            StateProtocol = stateProtocol

                        };
                        OnDiscoveryReply(new DeviceDiscoveryEventArgs {RobeatsDevice = robeatsDevice});

                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
        }

这总是引发异常:The requested address is not valid in its context [::]:4568

1 个答案:

答案 0 :(得分:1)

UDP套接字是无连接的。按照惯例(不要问我为什么),UDP套接字实现上的“连接”方法将建立默认端点/过滤流量。如果您想接收来自任何地址的流量,则根本不需要“连接”。使用具有签名UdpClient(Int32,AddressFamily)的构造函数,并删除Connect()调用:

public async void AwaitDiscoveryReply()
      {
          try
        {
            using (var client = new UdpClient(4568,AddressFamily.InterNetworkV6))
            {

                    var result = await client.ReceiveAsync();
                    Debug.WriteLine("Received DR");
                    var stateProtocol = StateProtocol.FromBytes(result.Buffer);
                    var robeatsDevice = new RobeatsDevice
                    {
                        Id = stateProtocol.DeviceId,
                        Name = stateProtocol.DeviceName,
                        EndPoint = client.Client.RemoteEndPoint,
                        StateProtocol = stateProtocol

                    };
                    OnDiscoveryReply(new DeviceDiscoveryEventArgs {RobeatsDevice = robeatsDevice});

            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
    }