2012-01-31 137 views
1

我想在本地機器上獲取IP地址:獲取和檢查本地計算機的IP地址

private string GetIP() 
    { 

     string strHostName = ""; 
     strHostName = System.Net.Dns.GetHostName(); 

     IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName); 


     IPAddress[] addr = ipEntry.AddressList; 

     foreach (IPAddress ipaddr in addr) 
     { 
      if (ipaddr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
       return ipaddr.ToString(); 
     } 

     return "IP error";         
    } 

但是我無法找到一個方法來確定哪些接口是一個我需要的。例如:

enter image description here

我很幸運的是,我需要的是第二個在列表中。但如果它在後面,我會得到一個錯誤的界面IP。如何檢查我是否獲得IP用於本地連接(或通常,負責連接的接口)。

+0

你怎麼能指望你程序知道它應該查看哪個NIC? – 2012-01-31 13:42:55

+0

這就是我不知道如何實現。現在只需要列表中的第一個InterNetwork。我想以某種方式驗證它是本地連接。 – and 2012-01-31 13:51:33

+0

什麼是所有在列表中的其他IP的,如果他們不屬於本地連接? – 2012-01-31 13:52:38

回答

2

您可以直接(而不僅僅是他們的IPS)枚舉network interfaces,然後篩選基於其接口類型:

var interfaces = NetworkInterface.GetAllNetworkInterfaces() 

然後用類似的東西過濾它:

interfaces.Where(ni => ni.NetworkInterfaceType != NetworkInterfaceType.Loopback && 
         ni.NetworkInterfaceType != NetworkInterfaceType.Tunnel) 

它仍然可以返回多個網絡接口,但它會過濾掉至少他們中的一些你不想要的。我使用上面的過濾器來擺脫環回和虛擬機接口。

然後從那裏你可以得到網絡接口的IP地址使用IP properties

在簡潔的精神,一旦你確定哪些接口是正確的,你可以用得到的接口的IPv4地址(或其中至少一個):

iface.GetIPProperties().UnicastAddresses.SingleOrDefault(ua => ua.Address.AddressFamily == AddressFamily.InterNetwork); 
+0

我之前嘗試過,但是(手動選擇正確的界面)IP屬性讓我錯誤的IP。它獲取網關的IP。 – and 2012-01-31 14:15:43

+0

然後你不使用來自IP屬性的正確屬性。發佈您使用的代碼,我們可以幫助您。這裏有一個提示,你關心的地址通常稱爲*單播*地址。 – 2012-01-31 14:16:37

+0

IPAddressCollection ips = currentNic.GetIPProperties()。DnsAddresses;錯的嗎? – and 2012-01-31 14:25:04

0

沒有方法,對主機名

IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); 

它在你的DNS返回本地計算機的地址爲所有登記地址

因此,如果你的DNS你的機器有一個返回一個地址名稱與一個IP地址相關聯,它將僅返回該地址,否則將返回與該主機名關聯的地址列表

您必須「過濾」列表以瞭解您的本地地址

看一看下面:

How to get the IP address of the server on which my C# application is running on?

+1

對我說,返回相同的地址集與'GetHostEntry()'。 – svick 2012-01-31 13:45:21

+0

他們返回相同的信息,但他們的行爲不同 http://msdn.microsoft.com/en-us/library/ms143998(v=vs.100)。aspx GetHostAddresses方法對於IP文字具有不同的行爲。如果上述步驟#1成功(它成功解析爲IP地址),則該地址將立即返回。沒有嘗試進行反向查找。 – 2012-01-31 13:51:59

+0

sivick說什麼。 GetHostAddresses()或GetHostEntry()我得到一個列表。 – and 2012-01-31 13:52:59