首页 > 解决方案 > 当程序在正确的端口上侦听时,为什么“[Errno 61] Connection refused”,套接字绑定到所有接口?

问题描述

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

我有客户端和服务器 Python 程序,它们在同一台机器上运行时工作正常,当客户端连接到我机器的本地 IP(不是 127.0.0.1,而是分配给我机器的 IP)时。我无法让它与我的公共 IP 一起使用。

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

tcp4 0 0 *.50000 *.* LISTEN

我似乎也可以通过在线端口检查工具访问该端口,该工具显示在我运行程序时端口是打开的,当我关闭该程序时端口是关闭的。我的程序还注册了这个工具的连接。

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

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

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

标签: pythonsocketsnetworkingportforwarding

解决方案


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

我怀疑问题仅仅是您无法从家庭网络内部连接到路由器的公共 IP 地址。我在本地网络上尝试了同样的事情并遇到了同样的行为。

如果您在开发过程中确实需要您的公共 ip,您可以将其作为别名分配给您的本地接口之一ip addr add 1.2.3.4/32 dev eth0(访问远程系统进行测试。


推荐阅读