DarkEyeDragon
DarkEyeDragon

Reputation: 330

UdpClient wont connect to IpAdress.Any

I'm trying to listen for UDP packets from unknown source. But can't bind on the "unspecified adress" (0.0.0.0 or ::)

I've already tried listening on ::1. But from what i tested that only works for local connections that don't pass the network interface.

        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);
            }
        }

This keeps throwing the exception: The requested address is not valid in its context [::]:4568

Upvotes: 1

Views: 956

Answers (1)

BadZen
BadZen

Reputation: 4265

UDP sockets are connectionless. "Connect" methods on UDP socket implementations, by convention (don't ask me why) establish default endpoints / filter traffic. If you want to receive traffic from any address, you don't need to "connect" at all. Use the constructor with signature UdpClient(Int32, AddressFamily) and delete the Connect() invocation:

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);
        }
    }

Upvotes: 2

Related Questions