You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

验证方案

你可以通过简单测试验证上述逻辑:

  1. 直接调用当前的is_available(8980),会返回False(因为返回值111不等于0),对应端口空闲状态
  2. 启动一个临时监听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("按回车键停止监听")
  1. 保持测试服务运行,再次调用is_available(8980),此时会返回True,对应端口已被占用的状态。

极低概率下,如果本地回环网卡上配置了iptables/nftables规则主动reject对应端口的连接,也会返回111错误,但默认lo网卡的流量是不会被防火墙拦截的,这种场景非常少见。

内容的提问来源于stack exchange,提问作者Litchy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 20:36:22