为什么我无法使用公共IP连接到我的服务器?
我有一个服务器程序和一个客户端程序。在开发程序时,为了方便起见,我在同一台机器上运行服务器和客户端。服务器开始使用这些线路监听传入连接:为什么我无法使用公共IP连接到我的服务器?
var listener = new TcpListener(IPAddress.Any, 7070);
listener.Start();
客户端连接到使用这些线路的服务器(简体):
var client = new TcpClient(AddressFamily.InterNetwork);
client.Connect(IPAddress.Loopback, 7070);
我使用IPAddress.Loopback
因为我运行在同一台机器上的程序。但是,知道服务器和客户端将来不一定会在同一台计算机上运行,我将其从http://icanhazip.com(IPAddress.Parse(...)
)更改为我的公共IP。由于该客户端无法连接到同一台计算机上的服务器,但No connection could be made because the target machine actively refused it <my public ip:7070>
例外。
我试图禁用我的防火墙,但它仍然无法正常工作。为什么服务器拒绝连接?我没有专门告诉它听所有接口与IPAddress.Any
?
为什么会发生这种情况,我该如何解决?
下面是我对这个问题的意见,这是希望建立正确的答案:
你的公网IP是由ISP提供,实际上是你的路由器的地址。路由器为本地网络内的计算机的传出连接执行网络地址转换(NAT)。这些请求对于Internet来说就像它们都来自一个IP,并且您的路由器根据地址转换表将响应发送到正确的本地计算机。这适用于传出连接,但不适用于传入连接。
如果有东西试图打开从互联网到您的路由器的TCP连接,路由器不知道它可能试图连接到哪个本地计算机,除非您专门配置它将该流量转发到本地的特定计算机网络。这就是端口转发的地方。如果你还没有配置端口转发,路由器会说:“对不起,我没有处理端口7070上的传入请求。”
您的开发机器是在路由器后面吗?
通过您的公共IP地址发送给您的网络流量通过特定的网络协议到达给定端口上的路由器。您的路由器需要知道您的网络内部何处发送此流量。流量来自互联网到您的机器,并且您的路由器无法或不会将流量转发到您计算机的机器。
由于网络地址转换(NAT)和通用即插即用(UPnP)的功能,您在日常生活中不会注意到这一点。这里详细介绍一些细节,网络地址转换允许修改流量头以将流量从您的公共IP路由到您的网络上的实际机器IP。当传入流量尝试打开网络上连接的端口时,需要将路由器配置为适当地转发该流量。通用即插即用是许多现代路由器支持的协议,允许软件和设备在无需转发端口的情况下无缝地路由流量。
这使你有两个选择:
对于开发目的,访问你的路由器和期望的端口转发到您的开发机器
对于一个更强大的应用程序,特别是如果你要在不同的机器或不同的网络上运行此操作,请考虑将UPnP support添加到您的应用程序中,同时也了解某些用户可能不支持或启用UPnP,在这种情况下,端口转发仍然是必需的。
所以你说你已经尝试过'client.Connect(,7070)',这是当你得到异常?这是我所期望的,除非你正在通过端口7070进行从路由器到你的计算机的端口转发。 – adv12
@ adv12所以你告诉我,这是我的路由器拒绝连接? – foxneSs
您的连接到您的公共IP的能力取决于您的路由器/面向互联网的设备,至少您需要一个端口转发规则,并且通常NAT仍然会阻止其工作。 –