// Note - using List<string> here because if I use IPAddress then I get into
        // a situation where Unity can't build because IPAddress seems to be in
        // System.dll on .NET 3.51 and in System.Net.Primitives in UWP.
        // I suspect that I'll see some other, similar problems.
        public static List<string> GetConnectedIpAddresses(
            bool wifiOnly,
            AddressFamilyType addressFamily = AddressFamilyType.IP4)
        {
            var profiles = NetworkInformation.GetConnectionProfiles();

            var connectedAdapterIds = NetworkInformation.GetConnectionProfiles()
                .Where(
                    p => (p.GetNetworkConnectivityLevel() != NetworkConnectivityLevel.None) &&
                         IsNetworkTypeCandidate(p.NetworkAdapter.IanaInterfaceType, wifiOnly)
                )
                .Select(
                    p => p.NetworkAdapter.NetworkAdapterId
                );

            var addresses = NetworkInformation.GetHostNames()
                .Where(
                        name =>
                            (name.IPInformation != null) &&
                            (name.IPInformation.NetworkAdapter != null) &&
                            connectedAdapterIds.Contains(name.IPInformation.NetworkAdapter.NetworkAdapterId) &&
                            (name.Type == AddressTypeToHostNameType(addressFamily))
                )
                .Select(
                    name => name.CanonicalName
                )
                .ToList();

            return (addresses);
        }
        // Note - using List<string> here because if I use IPAddress then I get into
        // a situation where Unity can't build because IPAddress seems to be in
        // System.dll on .NET 3.51 and in System.Net.Primitives in UWP.
        // I suspect that I'll see some other, similar problems.
        public static List <string> GetConnectedIpAddresses(
            bool wifiOnly                   = true,
            bool excludeVirtualNames        = true,
            AddressFamilyType addressFamily = AddressFamilyType.IP4)
        {
#if WINDOWS_UWP
            var connectedAdapterIds = NetworkInformation.GetConnectionProfiles()
                                      .Where(
                p => (p.GetNetworkConnectivityLevel() != NetworkConnectivityLevel.None) &&
                IsNetworkTypeCandidate(p.NetworkAdapter.IanaInterfaceType, wifiOnly)
                )
                                      .Select(
                p => p.NetworkAdapter.NetworkAdapterId
                );

            var addresses = NetworkInformation.GetHostNames()
                            .Where(
                name =>
                (name.IPInformation != null) &&
                (name.IPInformation.NetworkAdapter != null) &&
                connectedAdapterIds.Contains(name.IPInformation.NetworkAdapter.NetworkAdapterId) &&
                (name.Type == AddressTypeToHostNameType(addressFamily))
                )
                            .Select(
                name => name.CanonicalName
                )
                            .ToList();

            return(addresses);
#else
            var addresses =
                NetworkInterface.GetAllNetworkInterfaces()
                .Where(
                    ni => IsNetworkCandidate(ni, wifiOnly, excludeVirtualNames))
                .SelectMany(
                    ni => ni.GetIPProperties().UnicastAddresses)
                .Where(
                    address => address.Address.AddressFamily == AddressTypeToFamily(addressFamily))
                .Select(
                    address => address.Address.ToString())
                .ToList();

            return(addresses);
#endif
        }
 static HostNameType AddressTypeToHostNameType(AddressFamilyType type)
 {
     return (type == AddressFamilyType.IP4 ? HostNameType.Ipv4 : HostNameType.Ipv6);
 }
 static AddressFamily AddressTypeToFamily(AddressFamilyType type)
 {
     return(type == AddressFamilyType.IP4 ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6);
 }