Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';无法通过编程获得公共IP,路由器设置问题?_C#_Ip Address - Fatal编程技术网

C# Can';无法通过编程获得公共IP,路由器设置问题?

C# Can';无法通过编程获得公共IP,路由器设置问题?,c#,ip-address,C#,Ip Address,在我的程序中,我得到本地机器的公共IP地址,如下所示 public static IPAddress getIPAddress() { IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress addr in localIPs) { if (addr.AddressFamily == AddressFamily.InterNetwork)

在我的程序中,我得到本地机器的公共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。我怎么做呢?

你想要什么是不可能的。路由器是一种代理,所有流量都必须通过它。所有内部设备(包括个人电脑、笔记本电脑、平板电脑等)的外部IP地址都是相同的——内部IP地址不同。设备了解其外部IP地址的唯一方法是查询路由器(这可能不可能),或查询外部源。您在帖子中的端口转发页面仅显示路由器在该端口上重定向传入流量的位置,但它不会告诉电脑其外部IP地址是什么——因为一般来说,外部IP地址与电脑无关。

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

您可以向类似于获取外部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();

此处的更多信息:

您可以向站点发出请求,以获取您的外部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();

更多信息请点击此处:

没有可靠的fire方法可以做到100%的工作时间。但是,有两种方法在大多数情况下都有效

第一种是使用外部STUN服务器。向软件中添加一个配置条目相对容易,允许用户更改STUN服务器。如果此服务器发生更改或停机,用户可以选择另一个。。他们中有很多人。STUN服务器将用户的IP地址返回给呼叫者,并且被大多数VOIP设备使用

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


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

没有可靠的fire方法可以做到这一点,它可以在100%的时间内工作。但是,有两种方法在大多数情况下都有效

第一种是使用外部STUN服务器。向软件中添加一个配置条目相对容易,允许用户更改STUN服务器。如果此服务器发生更改或停机,用户可以选择另一个。。他们中有很多人。STUN服务器将用户的IP地址返回给呼叫者,并且被大多数VOIP设备使用

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


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

在这种情况下,
Dns.GetHostName
返回什么?只返回内部IP地址听起来像是在家里,你直接连接到路由器,它不执行网络地址转换,所以你可以得到你的路由器的IP地址。你朋友的路由器正在执行NAT,这意味着每台机器都有一个专用IP,比如192.168.blah.blah或10.blah。在这种情况下,您需要以某种方式与路由器进行通信,并询问其IP地址。是的,在家里,我通过电缆连接到路由器。如果不询问外部人员(或通过某种私人魔术与NAT箱交谈),您无法获得外部可见的IP地址在这种情况下,
Dns.GetHostName
返回什么?只有内部IP地址听起来像是在家里,你直接连接到你的路由器,它没有执行网络地址转换,所以你得到了路由器的IP地址。你朋友的路由器正在执行NAT,这意味着每台机器都有一个专用IP,比如192.168.blah.blah或10.blah。在这种情况下,您需要以某种方式与路由器通信,并询问其IP地址。是的,在家里,我通过电缆连接到我的路由器。如果不向外界询问(或通过某种私人魔术与NAT箱交谈),您无法获得外部可见的IP地址。我需要将代码设置为通用,现在,它只有在直接连接到互联网的情况下才能工作,如果使用Wi-Fi,我必须访问第三方网站。我有什么保证,这个网站将始终可以访问?你没有任何保证。我需要设置我的代码是通用的,现在它只工作