2008-12-11 27 views
25

En una aplicación .NET, ¿cómo puedo identificar qué interfaz de red se utiliza para comunicarse con una dirección IP determinada?Identificación de la interfaz de red activa

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.

Respuesta

31

La forma más sencilla sería:

UdpClient u = new UdpClient(remoteAddress, 1); 
IPAddress localAddr = ((IPEndPoint)u.Client.LocalEndPoint).Address; 

Ahora, si desea que el NetworkInterface objeto haces algo como:


foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
{ 
    IPInterfaceProperties ipProps = nic.GetIPProperties(); 
    // check if localAddr is in ipProps.UnicastAddresses 
} 


Otra opción es utilizar P/Invoke y llame GetBestInterface() para obtener el índice de interfaz, vuelva a recorrer todas las interfaces de red. Como antes, tendrá que buscar GetIPProperties() para obtener la propiedad IPv4InterfaceProperties.Index).

+2

después de algunas investigaciones que estoy encontrando que la "mejor" respuesta significa: 1. La primera IP del adaptador con la ruta combinada/combinación de puerta de enlace predeterminada con la métrica más baja. 2. En caso de un empate métrico, gana el adaptador con el orden de enlace más bajo. – halr9000

+3

usando broadcast, LocalEndPoint siempre es 0.0.0.0:broadcastPort ... –

3

La información que está buscando estará en WMI.

Este ejemplo mediante WMI puede conseguir que la mayor parte de la forma:

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 los adaptadores por ejemplo, direcciones IP, etc.

También pueden consultar la clase Win32_NetworkAdapter para averiguar 'static'about cada adaptador (velocidad máxima, fabricante, etc)

1

al menos se puede empezar con eso, que le da 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); 
} 
4

Ninguno de estos dará realmente el OP la información que está buscando - lo que quiere saber qué interfaz se utiliza para llegar a un destino determinado. Una forma de hacer lo que quiera sería pagar el comando route usando System.Diagnostics.Process class, luego raspe la salida de la pantalla. route PRINT (destination IP) le proporcionará algo utilizable. Probablemente esa no sea la mejor solución , pero es la única que puedo darle en este momento.

2

Sólo para dar un cuadro completo: otro enfoque sería utilizar Socket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ...)

ConferenceXP incluye la función integral en lugar de envolver esto, funciona con IPv4/6 y las direcciones de multidifusión: https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs#L84

+0

Esto es exactamente lo que se necesita – Itamar

+0

ejemplo de código completo para consultar la tabla de enrutamiento por 'Socket.IOControl' se puede encontrar [aquí] (http: // stackoverflow. com/a/26611456/684096) – BatteryBackupUnit

Cuestiones relacionadas