Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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