为什么我无法使用我的公共 IP 连接到我的服务器?

fox*_*eSs 3 c# client tcp tcplistener server

我有一个服务器程序和一个客户端程序。在开发程序时,为了方便起见,我在同一台计算机上运行服务器和客户端。服务器开始使用以下几行侦听传入连接:

var listener = new TcpListener(IPAddress.Any, 7070);
listener.Start();
Run Code Online (Sandbox Code Playgroud)

客户端使用以下几行连接到服务器(简化):

var client = new TcpClient(AddressFamily.InterNetwork);
client.Connect(IPAddress.Loopback, 7070);
Run Code Online (Sandbox Code Playgroud)

我使用是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吗?

为什么会发生这种情况以及如何解决它?

adv*_*v12 8

这是根据我对问题的评论构建的答案,希望是正确的:

您的公共IP由您的ISP提供,实际上是您的路由器的地址。路由器对本地网络内计算机的传出连接进行网络地址转换 (NAT)。这些请求在互联网上看起来就像它们都来自一个 IP,并且您的路由器根据地址转换表将响应发送到正确的本地计算机。这适用于传出连接,但不适用于传入连接。

如果某些东西尝试打开从 Internet 到您的路由器的 TCP 连接,则路由器不知道它可能尝试连接到哪台本地计算机,除非您专门将其配置为将该流量转发到本地网络上的特定计算机。这就是端口转发的用武之地。如果您尚未配置端口转发,路由器只会说:“抱歉,我不处理端口 7070 上的传入请求。”