Определение активного сетевого интерфейса

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

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

11.12.2008 14:48:44
5 ОТВЕТОВ
РЕШЕНИЕ

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

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собственности).

37
7.03.2009 11:13:55
после некоторых исследований я обнаружил, что «лучший» ответ означает: 1. Первый IP-адрес адаптера с соответствующей комбинацией маршрута / шлюза по умолчанию с самой низкой метрикой. 2. В случае метрической связи выигрывает адаптер с наименьшим порядком привязки.
halr9000 15.10.2009 15:21:18

Информация, которую вы ищете, будет в 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 класс , чтобы выяснить «static'about каждый адаптер (максимальная скорость, производитель и т.д.)

3
11.12.2008 15:02:10

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

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

foreach (System.Net.IPAddress address in hostEntry.AddressList)
{
    Console.WriteLine(address);
}
2
11.12.2008 15:06:08

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

5
11.12.2008 17:22:12

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

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

2
20.11.2013 10:09:38
Это именно то, что нужно
Itamar 22.10.2014 15:33:24
полный пример кода для запроса таблицы маршрутизации Socket.IOControlможет быть найден здесь
BatteryBackupUnit 10.11.2014 10:28:13