【问题标题】:Can't get public IP programatically, router settings issues?无法以编程方式获取公共 IP,路由器设置问题?
【发布时间】:2015-06-13 23:25:50
【问题描述】:

在我的程序中,我正在像这样获取本地机器的公共 IP 地址

public static IPAddress getIPAddress()
{
    IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
    foreach (IPAddress addr in localIPs)
    {
        if (addr.AddressFamily == AddressFamily.InterNetwork)
        {
            return addr;
        }
    }
    return null;
}

而且在我住的地方工作得很好。

现在我在朋友家,我通过 Wi-Fi 连接到互联网,这段代码没有给我我的外部 IP 地址,它可能与路由器设置有关,但我不是对网络非常熟悉...

路由器是TP-LINK,我可以这样访问它的设置

顺便说一句,8080端口正是我需要的,我只需要能够访问我的公共IP。我该怎么做?

【问题讨论】:

  • Dns.GetHostName 在这种情况下返回什么?
  • 仅限内部 IP 地址
  • 这听起来像在家里,你直接连接到你的路由器,它没有进行网络地址转换,所以你得到了你的路由器的 IP 地址。你朋友的路由器正在执行 NAT,这意味着每台机器都有一个私有 IP,比如 192.168.blah.blah 或 10.blah。在这种情况下,您需要以某种方式与路由器通信并询问其 IP 地址是什么。
  • 是的,我在家通过电缆连接到路由器
  • 如果不询问外面的人(或通过一些私人魔法与 NAT 框交谈),您将无法获得外部可见的 IP 地址

标签: c# ip-address


【解决方案1】:

您可以向http://icanhazip.com/ 之类的网站发出请求以获取您的外部 IP 地址

var request = WebRequest.Create("http://ipv4.icanhazip.com/");
var response = request.GetResponse();
var dataStream = response.GetResponseStream();
var reader = new StreamReader (dataStream);
string myIPAddress = reader.ReadToEnd();

更多信息在这里:https://msdn.microsoft.com/en-us/library/456dfw4f%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

【讨论】:

  • 有时它会返回 ipv6,ipv4.icanhazip.com 总是会返回 ipv4
  • 很高兴知道,谢谢。我只是在研究这个时才发现这个网站。
  • 以前用ifconfig.me,但是变慢了
【解决方案2】:

没有万无一失的方法可以在 100% 的时间里做到这一点。但是,有两种方法在大多数情况下都可以使用。

首先是使用外部 STUN 服务器。在您的软件中添加配置条目以允许用户更改 STUN 服务器相对容易,如果该服务器发生更改或出现故障,他们可以选择另一个......其中有很多。 STUN 服务器将用户 IP 地址返回给调用者,并被大多数 VOIP 设备使用。

第二种是使用内置的通用即插即用框架(UPnP)向路由器询问其IP地址。但是,这取决于支持 UPnP 的路由器并且它没有被禁用。此外,UPnP 可能无法在公司网络中工作,因为通常有几层路由器和防火墙。不过,对于家庭用户来说,这通常是一个不错的选择。这里有一个基于 .NET 的 UPnP 库,它利用 Windows 中内置的基于 COM 的 UPnP 组件:

http://managedupnp.codeplex.com/

我没有任何关于如何实现它的示例,但据说它有一个很好的文档库。

【讨论】:

    【解决方案3】:

    你想要的都是不可能的。路由器是一种代理,所有流量都必须通过它。所有内部设备(包括 PC、笔记本电脑、平板电脑等)的外部 IP 地址将相同——内部 IP 地址不同。设备知道其外部 IP 地址的唯一方法是查询路由器(这可能是不可能的),或者查询外部源。您在帖子中的端口转发页面仅显示路由器将该端口上的传入流量重定向到何处,但它不会告诉 PC 其外部 IP 地址是什么——因为通常情况下,外部 IP 地址对 PC无关紧要。

    【讨论】:

    • 我需要将我的代码设置为通用的,现在它只有在直接连接到互联网时才有效,如果使用 Wi-Fi 我必须访问第 3 方网站。我有什么保证可以随时访问此网站?
    • 你没有任何保证。
    猜你喜欢
    • 2018-05-28
    • 2020-05-06
    • 2010-10-11
    • 2020-12-15
    • 2013-05-07
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多