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