【问题标题】:How to get network ip address in internet dotted-integer format in c# winforms如何在c#winforms中以互联网点整数格式获取网络IP地址
【发布时间】:2013-06-27 03:37:24
【问题描述】:

我正在尝试以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;
    }
}

【问题讨论】:

    标签: c# ip-address ipv6


    【解决方案1】:

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

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

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

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

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

    获取您的公共地址最可靠的方法是连接到可以解析并以纯文本格式输出您的公共地址的外部 Web 服务器。 You already listed a suitable service with your question。您甚至可以通过自己提供服务来对服务负责。实现这个is very simple的PHP代码。

    如果您的路由器支持 UPnP(或 SNMP),您可以查询您的路由器,但这可能不起作用。这对您的机器来说可能就足够了,但是一些路由器不支持 UPnP,并且有安全意识的用户很可能由于安全漏洞而禁用了 UPnP。 See this SO question for a managed UpNp library.

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

    【讨论】:

    • 在 C# winform 应用程序中是否没有任何解决方法来获取 wan 地址,为什么我应该在我的 s/w 中使用第三个链接,因为,我无权访问该链接,任何时候该网页可能不可用。我们可能不喜欢依赖它。
    • @HaiderAliWajihi 我不确定这是唯一的方法,但我认为这是最适合生产的方法。我认为在没有外部 Web 服务器的情况下获取您的公共 IP 将需要更多代码,并且可能依赖于某些硬件。我更新了我的帖子以包含一个 PHP 脚本,您可以将其上传到您自己的 Web 服务器,这样您就可以对服务负责。
    • 感谢宝贵的时间,对我帮助很大。
    • 我仍然在 C# winform 中直接查看此解决方法,而不依赖于任何外部 url/网页/链接。为您的回答、努力和知识 +1。
    • @HaiderAliWajihi 我更新了我的答案,包括为您指明两种替代方法的方向。我还解释了为什么您需要外部服务(可能不是服务器)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我已按照您的建议更正了我的程序,但它返回了我的本地 IP。 “192.168.1.4”
    • 其实fe80::28d3:b8e8:caab:63b3%10也是你的本地IP。要从checkip.dyndns.org 获取地址,您必须通过 HTTP 从checkip.dyndns.org 读取它(例如,使用 System.Net.WebClient)。
    • 我想知道他们在那个链接里做了什么,难道我自己就不能获取wan地址吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2011-06-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多