Linux下Python socket检测端口返回111 未占用却连接拒绝
问题原因说明
核心逻辑错误
你对端口检测结果的判断写反了:
connect_ex()返回0代表TCP三次握手成功,即目标端口已经被进程监听占用,无法被新的服务绑定使用- 返回值
111对应Linux系统错误码ECONNREFUSED(连接拒绝),代表目标端口没有任何进程监听,内核直接返回RST包拒绝连接,此时端口才是空闲可用状态
你当前实现的is_available函数把result == 0作为端口可用的判定条件,相当于把"已占用"判定为"可用",和实际含义完全相反。
netstat查询的权限问题
如果你执行netstat -tnlp时没有使用root权限,将无法查看其他用户(包括root、系统服务账号)启动的进程对应的监听端口,这类端口的输出中PID/Program name列只会显示-,很容易被误判为无进程占用。
要查询全量的端口占用情况,需要加sudo执行:
sudo netstat -tnlp
也可以使用更高效、当前Linux发行版默认预装的ss命令查询,结果更准确:
sudo ss -tnlp
验证方案
你可以通过简单测试验证上述逻辑:
- 直接调用当前的
is_available(8980),会返回False(因为返回值111不等于0),对应端口空闲状态 - 启动一个临时监听8980端口的测试服务:
import socket test_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) test_sock.bind(('127.0.0.1', 8980)) test_sock.listen(1) input("按回车键停止监听")
- 保持测试服务运行,再次调用
is_available(8980),此时会返回True,对应端口已被占用的状态。
极低概率下,如果本地回环网卡上配置了iptables/nftables规则主动reject对应端口的连接,也会返回111错误,但默认lo网卡的流量是不会被防火墙拦截的,这种场景非常少见。
内容的提问来源于stack exchange,提问作者Litchy
相关产品推荐
相关产品推荐

