【问题标题】:Getting the ip-address获取ip地址
【发布时间】:2010-11-04 23:31:21
【问题描述】:

在 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 变量中的位置如何??

【问题讨论】:

  • 除非您自己意识到是什么让您寻求的一个 IP 地址比其他所有 IP 地址更适合您的目的,否则您可能会感到困惑。在返回值中依赖神奇的、未记录的订单是不好的做法。
  • 您要查找哪些 IP 地址?全部?

标签: c# .net ip-address


【解决方案1】:

假设您只想要 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.* 部分可能看起来像一个 hack,但记录在 IETF RFC 3927

【讨论】:

    【解决方案2】:

    您的十六进制地址是 IPv6,4 个十进制数字是 ipv4。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 2013-01-16
        • 2011-02-07
        • 2011-08-06
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多