using System; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; namespace AMWD.Common.Utilities { /// /// Provides some network utils. /// public static class NetworkHelper { /// /// Tries to resolve a into an to connect to. /// /// The hostname to resolve. /// An address family to use (available: and ). /// The fallback ip address when resolving failed. /// The resolved to connect to or value. public static IPAddress ResolveHost(string hostname, AddressFamily addressFamily = AddressFamily.Unspecified, IPAddress fallback = null) { if (IPAddress.TryParse(hostname, out var ipAddress)) { if (ipAddress.AddressFamily != AddressFamily.InterNetwork && ipAddress.AddressFamily != AddressFamily.InterNetworkV6) return fallback; if (addressFamily != AddressFamily.Unspecified && ipAddress.AddressFamily != addressFamily) return fallback; return ipAddress; } return Dns.GetHostAddresses(hostname) .Where(a => a.AddressFamily == AddressFamily.InterNetwork || a.AddressFamily == AddressFamily.InterNetworkV6) .Where(a => addressFamily == AddressFamily.Unspecified || a.AddressFamily == addressFamily) .OrderBy(a => a.AddressFamily) .FirstOrDefault() ?? fallback; } /// /// Tries to resolve a into an to bind (listen) on. /// /// The interface name to resolve. /// An address family to use (available: and ). /// The fallback ip address when resolving failed. /// The resolved to bind on or value. public static IPAddress ResolveInterface(string iface, AddressFamily addressFamily = AddressFamily.Unspecified, IPAddress fallback = null) { if (IPAddress.TryParse(iface, out var ipAddress)) { if (ipAddress.AddressFamily != AddressFamily.InterNetwork && ipAddress.AddressFamily != AddressFamily.InterNetworkV6) return fallback; if (addressFamily != AddressFamily.Unspecified && ipAddress.AddressFamily != addressFamily) return fallback; return ipAddress; } try { return Dns.GetHostAddresses(iface) .Where(a => a.AddressFamily == AddressFamily.InterNetwork || a.AddressFamily == AddressFamily.InterNetworkV6) .Where(a => addressFamily == AddressFamily.Unspecified || a.AddressFamily == addressFamily) .OrderBy(a => a.AddressFamily) .FirstOrDefault() ?? fallback; } catch (SocketException) { return NetworkInterface.GetAllNetworkInterfaces() .Where(nic => nic.Name.Equals(iface, StringComparison.OrdinalIgnoreCase)) .SelectMany(nic => nic.GetIPProperties().UnicastAddresses.Select(ai => ai.Address)) .Where(a => a.AddressFamily == AddressFamily.InterNetwork || a.AddressFamily == AddressFamily.InterNetworkV6) .Where(a => addressFamily == AddressFamily.Unspecified || a.AddressFamily == addressFamily) .OrderBy(a => a.AddressFamily) .FirstOrDefault() ?? fallback; } } } }