识别活动网络接口

27

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

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

6个回答

40

最简单的方式是:

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


3
经过一些研究,我发现“最佳”答案的意思是:
  1. 具有匹配路由/默认网关组合和最低度量值的适配器的第一个IP地址。
  2. 如果度量值相同,则绑定顺序最低的适配器获胜。
- halr9000

6

这两种方法都不能给OP提供他所需要的信息——他想知道哪个接口将用于到达特定目标。实现你想要的一种方法是使用System.Diagnostics.Process类调用shell命令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类,以了解每个适配器的“静态”信息(最大速度、制造商等)。


2

这正是所需之物。 - Itamar
可以在这里找到使用Socket.IOControl查询路由表的完整代码示例。 - BatteryBackupUnit

2

至少你可以从这开始,给出本地机器的所有DNS地址。

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

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

0
这是一个旧的帖子,但今天我正在寻找它,但找到了一个更好的答案,我觉得。
/// <summary>
/// Get ifIndex of ip (ip address to connect)
/// </summary>
/// <param name="ip">IP Address that want to connect</param>
/// <param name="description">Lan card description</param>
/// <param name="ifIndex">interface index</param>
/// <param name="ifAddress">IP Address of Lan Interface</param>
private static void CheckInterface(string ip, out string description, out int ifIndex, out IPAddress ifAddress)
{
    description = "";
    ifIndex = -1;
    ifAddress = IPAddress.Any;
    var myIp = IPAddress.Parse(ip);
    if (!NetworkInterface.GetIsNetworkAvailable()) return;
    foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (!adapter.SupportsMulticast) continue;
        if (adapter.OperationalStatus != OperationalStatus.Up) continue;
        var properties = adapter.GetIPProperties();
        if (!properties.MulticastAddresses.Any()) continue;
        var p = properties.GetIPv4Properties();
        if (p == null) continue;
        foreach (var ipInfo in properties.UnicastAddresses)
        {
            if (ipInfo.Address.AddressFamily == AddressFamily.InterNetwork)
            {
                //Console.WriteLine("Address:{0} == {1}", ipInfo.Address, myIp);
                var adpIp = ipInfo.Address.GetAddressBytes();
                var cmpIp = myIp.GetAddressBytes();
                if ((adpIp[0] == cmpIp[0]) && (adpIp[1] == cmpIp[1]) && (adpIp[2] == cmpIp[2]))
                {
                    description = adapter.Description;
                    ifIndex = p.Index;
                    ifAddress = ipInfo.Address;
                    return;
                    //Console.WriteLine("Name {0} ifIndex {1}", adapter.Description, p.Index);
                }
            }
        }
    }
}

今天对我来说没问题!(当 ifIndex 为-1 时,未找到接口)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接