Определение активного сетевого интерфейса - PullRequest
25 голосов
/ 11 декабря 2008

В приложении .NET как определить, какой сетевой интерфейс используется для связи с данным IP-адресом?

Я работаю на рабочих станциях с несколькими сетевыми интерфейсами, IPv4 и v6, и мне нужно получить адрес «правильного» интерфейса, используемого для трафика на данный сервер баз данных.

Ответы [ 5 ]

35 голосов
/ 07 марта 2009

Самый простой способ будет:

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

Теперь, если вам нужен объект NetworkInterface, вы делаете что-то вроде:


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


Другой вариант - использовать P / Invoke и вызвать GetBestInterface () , чтобы получить индекс интерфейса, а затем снова выполнить цикл по всем сетевым интерфейсам. Как и прежде, вам придется копаться в GetIPProperties(), чтобы перейти к свойству IPv4InterfaceProperties.Index.

5 голосов
/ 11 декабря 2008

Ни один из них фактически не даст оператору информацию, которую он ищет - он хочет знать, какой интерфейс будет использоваться для достижения определенного пункта назначения. Один из способов сделать то, что вы хотите, - это выполнить команду route с помощью класса System.Diagnostics.Process, а затем прокрутить вывод. route PRINT (destination IP) даст вам что-то полезное. Это, вероятно, не самое лучшее решение 1005 *, но это единственное, что я могу дать вам прямо сейчас.

3 голосов
/ 11 декабря 2008

Информация, которую вы запрашиваете, будет в WMI.

Этот пример с использованием WMI может помочь вам в большинстве случаев:

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

Класс Win32_NetworkAdapterConfiguration предоставит вам информацию о конфигурации ваших адаптеров, например, IP-адреса и т. д.

Вы также можете запросить класс Win32_NetworkAdapter , чтобы определить «статический» для каждого адаптера (максимальная скорость, производитель и т. Д.)

2 голосов
/ 20 ноября 2013

Просто чтобы дать полную картину: другой подход будет использовать Socket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ... )

ConferenceXP включает в себя довольно всеобъемлющую функцию, которая работает с IPv4 / 6 и многоадресными адресами: https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs#L84

1 голос
/ 11 декабря 2008

По крайней мере, вы можете начать с этого, давая вам все адреса из DNS для локальной машины.

IPHostEntry hostEntry = Dns.GetHostEntry(Environment.MachineName);

foreach (System.Net.IPAddress address in hostEntry.AddressList)
{
    Console.WriteLine(address);
}
...