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