【发布时间】:2016-12-25 14:35:16
【问题描述】:
我有一个服务器程序和一个客户端程序。在开发程序时,为了方便起见,我在同一台机器上运行服务器和客户端。服务器开始使用这些行监听传入的连接:
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 监听所有接口吗?
为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
所以你是说你已经尝试过
client.Connect(<your public IP>, 7070)并且那是你得到异常的时候?这是我所期望的,除非您在端口 7070 上从路由器到计算机的端口转发。 -
@adv12 所以你告诉我是我的路由器拒绝连接?
-
您能否连接到您的公共 IP 取决于您的路由器/面向互联网的设备,至少您需要一个端口转发规则,而且通常 NAT 仍然会阻止它工作。
-
我会按照我的理解解释它,但请注意,我不是专家:您的公共 IP 由您的 ISP 提供,实际上是您的路由器的地址。路由器为本地网络中计算机的传出连接执行网络地址转换 (NAT)。这些请求在互联网上看起来就像它们都来自一个 IP,并且您的路由器根据地址转换表将响应发送到正确的本地计算机。这适用于传出流量,但不适用于传入流量。 (在下一条评论中继续...)
-
如果有东西试图打开 TCP 连接 从 Internet 到您的路由器,除非您专门配置,否则路由器不知道它可能尝试连接的本地计算机将该流量转发到本地网络上的特定计算机。这就是端口转发的用武之地。如果您还没有配置端口转发,路由器只会说:“对不起,我不处理端口 7070 上的传入请求。”
标签: c# tcp server client tcplistener