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