无法以编程方式获取 public IP,路由器设置问题?

Can't get public IP programatically, router settings issues?

在我的程序中,我正在获取本地计算机的 public 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端口正是我需要的,我只需要能够访问我的public IP即可。我该怎么做?

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

您可以向 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

没有一种万无一失的方法可以在 100% 的时间内奏效。但是,有两种方法在大多数情况下都有效。

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

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

中内置的基于 COM 的 UPnP 组件

http://managedupnp.codeplex.com/

我没有任何关于如何实现它的例子,但它应该有一个很好的文档库。