2009-06-22 226 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被记录在案。