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

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

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

【问题讨论】:

    标签: c# .net networking


    【解决方案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
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-13
          • 2012-07-30
          相关资源
          最近更新 更多