为什么当程序在正确的端口上侦听时出现“[Errno 61] 连接被拒绝”,套接字绑定到所有接口?

Why "[Errno 61] Connection refused" when program is listening on correct port, socket is bound to all interfaces?

我会尽量简明扼要,但如果我能提供更多有用的信息,请告诉我。

我有客户端和服务器 Python 程序,当 运行 在同一台机器上并且当客户端连接到我机器的本地 IP(不是 127.0.0.1,但IP 分配给我的机器)。我无法让这个与我的 public IP 一起使用。

当我尝试让客户端连接到我的路由器的 public IP 地址时,出现 [Errno 61] Connection refused 错误。我的服务器使用 bind(("0.0.0.0", 50000)) 绑定到所有接口,并且我已经为我的路由器设置了端口转发。我通过 运行 netstat -an | grep LISTEN 验证该程序正在该端口上侦听并找到以下行:

tcp4 0 0 *.50000 *.* LISTEN

我似乎也可以通过 online port checking tool 到达该端口,这表明当我 运行 我的程序时该端口是打开的,当我关闭该程序时该端口关闭。我的程序还注册了来自该工具的连接。

我的程序接受来自端口检查工具的连接这一事实给我的印象是我的客户端代码丢失了一些东西,但我找不到任何答案。可能值得注意的是,我仍然 运行 我的服务器和客户端代码在同一台机器上,但我不确定为什么这会破坏事情。这是我用来在客户端连接的代码:

tcp_client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
tcp_client.connect(('my_public_ip', 50000))

我可以遵循任何诊断步骤来缩小我的问题范围吗?

在您花更多时间在此之前,请尝试从家庭网络之外的计算机连接到您的 public IP。如果必须的话,花几美元在一个 AWS 实例上花一个小时,或者尝试从朋友的机器上连接,等等。它可能会工作得很好。

我怀疑问题只是您无法从家庭网络内部连接到路由器的 public IP 地址。我在我的本地网络上尝试了同样的事情,并且 运行 变成了同样的行为。

如果您真的在开发过程中需要您的public ip,您可以将其作为别名分配给您的本地接口之一(ip addr add 1.2.3.4/32 dev eth0 )...但是使用本地网络上的地址可能更容易,或者只是 ar运行ge 定期访问远程系统进行测试。