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

时间:2016-08-18 15:22:47

标签: c# tcp server client tcplistener

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

var listener = new TcpListener(IPAddress.Any, 7070);
listener.Start();

客户端使用这些行连接到服务器(简化):

var client = new TcpClient(AddressFamily.InterNetwork);
client.Connect(IPAddress.Loopback, 7070);

我使用IPAddress.Loopback因为我在同一台机器上运行程序。但是,知道服务器和客户端将来不一定在同一台机器上运行,我将其从http://icanhazip.comIPAddress.Parse(...))更改为我的公共IP。因此,客户端无法连接到同一台计算机上的服务器,但No connection could be made because the target machine actively refused it <my public ip:7070>

例外

我尝试禁用我的防火墙,但它仍然无法正常工作。为什么服务器拒绝连接?我没有具体告诉它听{strong 1>所有接口吗?

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:3)

您的开发机器是否在路由器后面?

通过您的公共IP地址发送给您的网络流量通过特定的网络协议到达给定端口上的路由器。您的路由器需要知道网络内部发送此流量的位置。流量从互联网传输到您的计算机,您的路由器无法或不会将流量转发到您的计算机上。

由于网络地址转换(NAT)和通用即插即用(UPnP)的强大功能,您在日常生活中没有注意到这一点。在此处对某些详细信息进行着色,网络地址转换允许修改流量标头,以便将来自公共IP的流量路由到网络上的实际计算机IP。当传入流量尝试打开端口以在网络上建立连接时,需要配置路由器以适当地转发该流量。 Universal Plug and Play是许多现代路由器支持的协议,允许软件和设备无需转发端口即可无缝路由流量。

这为您提供了两个选项:

  1. 出于开发目的,访问路由器并将所需端口转发到开发计算机

  2. 对于更强大的应用程序,特别是如果您要在不同的计算机或不同的网络上运行此应用程序,请考虑将UPnP support添加到您的应用程序,同时还要了解可能不支持或启用UPnP一些用户,在这种情况下仍然需要端口转发。

答案 1 :(得分:2)

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

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

如果某些东西试图打开从Internet到路由器的TCP连接,路由器不知道它可能尝试连接的本地计算机,除非您专门配置它以将该流量转发到本地网络上的特定计算机。这就是端口转发的地方。如果您还没有配置端口转发,路由器就会说,“抱歉,我没有处理端口7070上的传入请求。”#34;