2013-07-10 54 views
1

我的应用程序在具有多个网络适配器(2-4之间)的计算机上运行,​​全部连接到不同的内部网络。识别特定的网络适配器

我需要获取特定适配器的ip地址以用于我的应用程序,问题是我不知道有关该适配器的足够信息。 适配器的名称不是常量,它们之间的网络掩码也不是它们连接的顺序(即索引)。

我也不能依靠使用适配器的ping地址,因为正如我所说的那样,它们连接到不同的网络(所以特定的地址可以从多个网络快速发送),并且因为并非所有适配器都必须连接到网络在任何时候。

我不知道该适配器这是什么:

  • 的IP地址是静态的所有适配器(当然是应用很多机器之间的不同)。
  • 我需要的适配器是计算机板载适配器。

是否有任何其他信息\技术\ dark-voodoo我可以用它来识别特定的适配器?

我的应用程序在C#-.Net 4中运行,但是因为这非常重要,所以我会在每个CLI中使用包装或脚本语言来解决此问题。

+0

在设备管理器网络适配器中有一个位置。不确定0是否总是表示板载。我不知道如何在.NET中获取这些信息。 – Paparazzi

+0

我试图沿着这条路走下去,但从我所了解的板载适配器一直是0索引取决于使用的主板的种类。 和我的问题中的很多其他因素一样,它不是恒定的。 –

回答

0

您需要使用pInvoke GetBestInterface(),然后找到具有该索引的接口,并获取其IpAddress。

[System.Runtime.InteropServices.DllImport("iphlpapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
     public static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex); 

    private string GetCorrectIPAddress(string server_ip_string) 
    { 
     string correctIpAddress = ""; 

     System.Net.IPAddress server_IpAddress = System.Net.Dns.GetHostEntry("server_ip_string").AddressList[0]; 

     UInt32 ipv4AddressAsUInt32 = BitConverter.ToUInt32(server_IpAddress.GetAddressBytes(), 0); 
     UInt32 interfaceindex; 

     int result = GetBestInterface(ipv4AddressAsUInt32, out interfaceindex); 
     foreach (System.Net.NetworkInformation.NetworkInterface nic in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      System.Net.NetworkInformation.IPInterfaceProperties ipProps = nic.GetIPProperties(); 
      if (ipProps.GetIPv4Properties().Index == interfaceindex) 
      { 
       correctIpAddress = ipProps.UnicastAddresses[0].Address.ToString(); 
      } 
     } 
     return correctIpAddress; 
    } 
+0

从我读到的GetBestInterface检索与给定地址有最佳连接的接口(我猜测你的建议中的server_ip_string)。 这是不好的,因为不同的接口连接到不同的网络。 每个给定的IP地址可以映射到每个不同网络上的不同机器,因此所有接口都可能与给定地址有很好的连接,但这些是不同的机器。 顺便说一句,不要花太多时间在这个,它已经三年了,那个系统已经被替换了。 –