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





Информация, которая вам нужна, будет в 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' о каждом адаптере (максимальная скорость, производитель и т. д.)
По крайней мере, вы можете начать с этого, предоставив вам все адреса из DNS для локальной машины.
IPHostEntry hostEntry = Dns.GetHostEntry(Environment.MachineName);
foreach (System.Net.IPAddress address in hostEntry.AddressList)
{
Console.WriteLine(address);
}
Ни один из них на самом деле не даст OP информацию, которую он ищет - он хочет знать, какой интерфейс будет использоваться для достижения данного пункта назначения. Один из способов сделать то, что вы хотите, - передать команду маршрут с помощью класса System.Diagnostics.Process, а затем очистить экран от вывода. route PRINT (destination IP) даст вам что-то полезное. Вероятно, это не решение Лучший, но это единственное, что я могу дать вам прямо сейчас.
Самый простой способ:
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).
Просто чтобы дать полную картину: другой подход - использовать Socket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ... ).
ConferenceXP включает в себя довольно обширную функцию, работающую с IPv4 / 6 и многоадресными адресами: https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs#L84
Это именно то, что нужно
полный пример кода для запроса таблицы маршрутизации с помощью Socket.IOControl можно найти здесь
после некоторого исследования я обнаружил, что «лучший» ответ означает: 1. Первый IP-адрес адаптера с соответствующей комбинацией маршрута / шлюза по умолчанию с наименьшей метрикой. 2. В случае метрической стяжки выигрывает адаптер с наименьшим порядком привязки.