0

我试图在http://checkip.dyndns.org/返回时获取网络 IP 地址。

但我从以下代码中得到了这个结果。

fe80::28d3:b8e8:caab:63b3%10

我想要互联网点整数格式的 ip 地址 lilke 122.168.149.143

foreach (IPAddress ipa in Dns.GetHostAddresses(Dns.GetHostName()))
{
    if (ipa.AddressFamily == AddressFamily.InterNetwork)
    {
        textBox2.Text = ipa.ToString();
        break;
    }
}
4

2 回答 2

3

当您的意思是按 IPv4 地址过滤时,您当前正在按 IPv6 地址过滤!这就是 IPAddress.ToString() 以冒号十六进制表示法返回 IP 的原因。

要按 IPv4 地址过滤,您需要根据 AddressFamily.InterNetwork 进行过滤:

if (ipa.AddressFamily == AddressFamily.InterNetwork)
{ }

据我了解,您希望获得您的公共地址。您列出的代码将返回您的私人(本地)地址!

Windows 操作系统不关心您的公共 IP。操作系统只是简单地路由到定义的网关,而不用担心细节。解析您的公共 IP 的唯一方法是查询一些外部系统。你需要外部帮助。

获取您的公共地址最可靠的方法是连接到可以解析并以纯文本格式输出您的公共地址的外部 Web 服务器。您已经在您的问题中列出了合适的服务。您甚至可以通过自己提供服务来对服务负责。实现这一点的 PHP 代码非常简单

如果您的路由器支持 UPnP(或 SNMP),您可以查询您的路由器,但这可能不起作用。这对于您的机器可能就足够了,但是一些路由器不支持 UPnP,并且有安全意识的用户很可能由于安全漏洞而禁用了 UPnP。有关托管 UpNp 库,请参阅此 SO 问题。

我读过你可以使用tracert到一个已建立的网站(你知道会在线),第一个“跳跃”将是你的路线。我从来没有试过这个。

于 2013-06-29T12:56:58.020 回答
1

点整数格式只能用于 IP 版本。4 个地址。

在代码示例中,您甚至明确选择了仅 IP 版本。6 个地址。

使用AddressFamily.InterNetwork而不是AddressFamily.InterNetworkV6选择 IPv4 地址,然后ToString将按照您期望的方式对其进行格式化。

于 2013-06-29T12:55:15.560 回答