识别活动网络接口

时间:2008-12-11 14:48:44

标签: c# .net networking

在.NET应用程序中,如何识别用于与给定IP地址通信的网络接口?

我在具有多个网络接口,IPv4和v6的工作站上运行,我需要获取用于流量到我给定数据库服务器的“正确”接口的地址。

5 个答案:

答案 0 :(得分:35)

最简单的方法是:

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属性。

答案 1 :(得分:5)

这些都不会给OP提供他正在寻找的信息 - 他想知道哪个接口将用于到达给定目的地。做你想做的事情的一种方法是使用System.Diagnostics.Process类转出 route 命令,然后屏幕截取输出。 route PRINT (destination IP)会为您提供有用的东西。那可能不是最好的解决方案,但它是我现在唯一可以给你的。

答案 2 :(得分: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类,找出每个适配器的'静态'(最高速度,制造商等)

答案 3 :(得分:2)

只是为了给出一个完整的图片:另一种方法是使用Socket.IOControl( SIO_ROUTING_INTERFACE_QUERY, ... )

ConferenceXP包含相当全面的功能包装,适用于IPv4 / 6和多播地址:https://github.com/conferencexp/conferencexp/blob/master/MSR.LST.Net.Rtp/NetworkingBasics/utility.cs#L84

答案 4 :(得分:1)

至少你可以从那开始,为你提供本地机器的dns的所有地址。

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

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