在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返回一些十六进制的IP地址,一些是十进制表示法等等。
问题是所需的十进制表示法会改变它在IPHostEntry
变量中的位置:它最初出现在最后一个位置,因此可以使用代码访问:
string ipText = IPHost.AddressList[IPHost.AddressList.Length - 1].ToString();
但是,在更改计算机的IP地址后,它现在显示在最后的第二个位置,因此需要使用以下代码进行访问:
string ipText = IPHost.AddressList[IPHost.AddressList.Length - 2].ToString();
是否有任何代码以十进制表示法检索IP地址,而不管它在IPHostEntry
变量中的位置?
答案 0 :(得分: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中有记录。
答案 1 :(得分:1)
我相信您要问的是,您可以区分DNS查询返回的IPv4和IPv6地址。答案是肯定的。检查IPAddress上的AddressFamily property并确保它返回InterNetwork。
答案 2 :(得分:1)
你的十六进制地址是IPv6,4个十进制数字是ipv4。