获取IP地址

在C#中:

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返回一些hex的IP地址,一些是十进制表示法,依此类推。

问题是所需的十进制表示法改变了它在IPHostEntry变量中的位置:它最初出现在最后一个位置,因此可以使用以下代码访问:

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

但是,在更改计算机的IP地址后,它现在显示在第二个最后位置,因此需要使用以下代码进行访问:

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

是否有任何代码以十进制表示法检索IP地址,而不IPHostEntryIPHostEntry变量中的位置?

假设你只想要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中有记录 。

我相信您要问的是,您能否区分DNS查询返回的IPv4和IPv6地址。 答案是肯定的。 检查IPAddress上的AddressFamily属性 ,并确保它返回InterNetwork 。

你的hex地址是IPv6,4个十进制数字是ipv4。