c# - Identificación de la interfaz de red activa
.net networking (5)
En una aplicación .NET, ¿cómo puedo identificar qué interfaz de red se utiliza para comunicarse con una dirección IP determinada?
Me estoy ejecutando en estaciones de trabajo con múltiples interfaces de red, IPv4 y v6, y necesito obtener la dirección de la interfaz "correcta" utilizada para el tráfico en mi servidor de base de datos dado.
Al menos puedes comenzar con eso, dándote todas las direcciones de dns para la máquina local.
IPHostEntry hostEntry = Dns.GetHostEntry(Environment.MachineName);
foreach (System.Net.IPAddress address in hostEntry.AddressList)
{
Console.WriteLine(address);
}
La forma más simple sería:
UdpClient u = new UdpClient(remoteAddress, 1);
IPAddress localAddr = ((IPEndPoint)u.Client.LocalEndPoint).Address;
Ahora, si desea el objeto NetworkInterface, haga algo como:
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
IPInterfaceProperties ipProps = nic.GetIPProperties();
// check if localAddr is in ipProps.UnicastAddresses
}
Otra opción es usar P / Invoke y llamar a GetBestInterface() para obtener el índice de la interfaz, y luego recorrer nuevamente todas las interfaces de red. Como antes, tendrá que buscar en GetIPProperties()
para obtener la propiedad IPv4InterfaceProperties.Index
).
La información que está buscando estará en WMI.
Este ejemplo que usa WMI puede hacerte la mayor parte del camino:
using System.Management;
string query = "SELECT * FROM Win32_NetworkAdapterConfiguration";
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
ManagementObjectCollection moCollection = moSearch.Get();// Every record in this collection is a network interface
foreach (ManagementObject mo in moCollection)
{
// Do what you need to here....
}
La clase Win32_NetworkAdapterConfiguration le dará información sobre la configuración de sus adaptadores, por ejemplo, direcciones IP, etc.
También puede consultar la clase Win32_NetworkAdapter para averiguar ''static'' sobre cada adaptador (velocidad máxima, fabricante, etc.)
Ninguno de estos le dará al OP la información que está buscando, quiere saber qué interfaz se utilizará para llegar a un destino determinado. Una forma de hacer lo que quiera es pagar el comando de ruta utilizando la clase System.Diagnostics.Process, luego raspe la salida en pantalla. route PRINT (destination IP)
le proporcionará algo utilizable. Probablemente no sea la mejor solución, pero es la única que puedo darte en este momento.
Solo para dar una imagen completa: otro enfoque sería usar Socket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ... )
ConferenceXP incluye una función bastante completa que lo incluye, funciona con IPv4 / 6 y direcciones de multidifusión: https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs#L84