识别活动网络接口

Posted

技术标签:

【中文标题】识别活动网络接口【英文标题】:Identifying active network interface 【发布时间】:2010-09-26 10:52:27 【问题描述】:

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

【讨论】:

经过一番研究,我发现“最佳”答案意味着: 1. 适配器的第一个 IP 与匹配的路由/默认网关组合与最低指标。 2. 在度量平局的情况下,具有最低绑定顺序的适配器获胜。【参考方案2】:

这些都不会真正为 OP 提供他正在寻找的信息——他想知道哪个接口将用于到达给定的目的地。做你想做的事情的一种方法是使用 System.Diagnostics.Process 类对 route 命令进行外壳处理,然后对输出进行屏幕抓取。 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 类以找出每个适配器的“静态”(最大速度、制造商等)

【讨论】:

【参考方案4】:

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

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

foreach (System.Net.IPAddress address in hostEntry.AddressList)

    Console.WriteLine(address);

【讨论】:

【参考方案5】:

只是给出一个完整的图片:另一种方法是使用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查询路由表的完整代码示例见here

以上是关于识别活动网络接口的主要内容,如果未能解决你的问题,请参考以下文章

libpcap:如何获取活动网络接口(Mac OSX)

zabbix通过自动发现功能实现自动识别网络设备接口

sh macOS:获取当前活动的网络设备名称,接口,mac

通过ospf network 宣告的网络,cisco是如何识别接口ip地址在该网段内。

linux网络管理命令

华为网络设备基本配置