Определение активного сетевого интерфейса
В .NET-приложении, как я могу определить, какой сетевой интерфейс используется для связи с данным IP-адресом?
Я работаю на рабочих станциях с несколькими сетевыми интерфейсами, IPv4 и v6, и мне нужно получить адрес "правильного" интерфейса, используемого для трафика, на мой данный сервер базы данных.
Ответы
Ответ 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);
}