在我的程序中,我正在获取本地机器的公共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。我该怎么办?
答案 0 :(得分:3)
您可以向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
答案 1 :(得分:2)
没有确定的方法可以在100%的时间内完成这项工作。但是,有两种方法可以在大多数情况下起作用。
第一种是使用外部STUN服务器。将配置条目添加到软件中以允许用户更改STUN服务器相对容易,如果此服务器发生变化或发生变化,他们可以选择另一个......其中有很多。 STUN服务器将用户IP地址返回给调用者,并被大多数VOIP设备使用。
第二种是使用内置的通用即插即用框架(UPnP)向路由器询问其IP地址。但是,这个取决于支持UPnP的路由器,并且它没有被禁用。此外,UPnP可能无法在企业网络中工作,因为通常有多层路由器和防火墙。不过,对于家庭用户来说,这通常是一个不错的选择。这里有一个基于.NET的UPnP库,它利用Windows中内置的基于COM的UPnP组件:
http://managedupnp.codeplex.com/
我没有任何关于如何实现它的示例,但它应该有一个很好的文档库。
答案 2 :(得分:1)
你想要的是不可能的。路由器是各种代理,所有流量都必须通过它。所有内部设备(包括PC,笔记本电脑,平板电脑等)的外部IP地址都是相同的 - 内部IP地址有所不同。设备知道其外部IP地址的唯一方法是查询路由器(可能无法查询)或查询外部源。您帖子中的端口转发页面仅显示路由器在该端口上重定向传入流量的位置,但它会告诉PC没有外部IP地址 - 因为通常是PC的外部IP地址是无关紧要的。