2009-06-22 321 views
4

在C#:獲取IP地址

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName()); 

for (int i = 0; i < IPHost.AddressList.Length; i++) 
{ 
    textBox1.AppendText("My IP address is: " 
     + IPHost.AddressList[i].ToString() + "\r\n"); 
} 

在這段代碼中,IPHostEntry變量包含計算機的所有IP地址。 現在,據我所知,Windows vista以十六進制方式返回一些IP地址,其中一些以十進制表示法等等。

的問題是,這是所期望的十進制記數法中的IPHostEntry變量改變其位置:它最初是在最後的位置存在的,因此可以與代碼訪問:

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 1].ToString(); 

但是改變後計算機的IP地址,它現在出現在2日最後一個位置,因此需要使用代碼訪問:

string ipText = IPHost.AddressList[IPHost.AddressList.Length - 2].ToString(); 

是否有十進制獲取IP地址不論其位置的任何代碼在IPHostEntry變量?

+1

恐怕你會一直困惑,除非你自己意識到是什麼讓你尋找的一個IP地址更適合你的目的而不是所有其他的IP地址。依靠神奇的,無證的訂單來回報價值是不好的做法。 – 2009-06-22 20:32:27

回答

1

我相信你問的是你可以區分從你的DNS查詢返回的IPv4和IPv6地址。答案是肯定的。檢查IPAddress上的AddressFamily property,並確保它返回InterNetwork

1

您的十六進制地址是IPv6,四位十進制數是ipv4。

9

假設你只需要IPv4地址,我目前使用這個代碼(修改了一下發布),這對我的使用足夠強大。只需調用的ToString的結果得到的地址:

// return the first IPv4, non-dynamic/link-local, non-loopback address 
public static IPAddress GetIPAddress() 
{ 
    IPAddress[] hostAddresses = Dns.GetHostAddresses(""); 

    foreach (IPAddress hostAddress in hostAddresses) 
    { 
     if (hostAddress.AddressFamily == AddressFamily.InterNetwork && 
      !IPAddress.IsLoopback(hostAddress) && // ignore loopback addresses 
      !hostAddress.ToString().StartsWith("169.254.")) // ignore link-local addresses 
      return hostAddress; 
    } 
    return null; // or IPAddress.None if you prefer 
} 

169.254 *部分可能看起來像一個黑客,但在IETF RFC 3927被記錄在案。