2013-07-10 53 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地址可以映射到每個不同網絡上的不同機器,因此所有接口都可能與給定地址有很好的連接,但這些是不同的機器。 順便說一句,不要花太多時間在這個,它已經三年了,那個系統已經被替換了。 –