← 中文资源

简体中文版本

Python 绑定套接字时报 OSError: [Errno 98] 地址已被占用

通过释放套接字、启用复用选项并理解 TIME_WAIT 行为,解决地址已被占用错误。

阅读英文原文

症状

服务器绑定套接字时以 OSError: [Errno 98] Address already in use 启动失败。它可能此前多次重启;停止后立刻重启会失败,等待几秒则成功。这是存活进程或 TIME_WAIT 套接字仍占着本地端口的典型特征。

诊断

用 ss -ltnp 找出监听该端口的进程;用 ss -tan 查看 TIME_WAIT 套接字;检查代码是否设置了 SO_REUSEADDR 或框架等价选项。

ss -ltnp | grep :8000

根因

本地地址仍被存活进程或处于 TIME_WAIT 的套接字占用,绑定调用无法取得它。代码通常没问题,端口状态才是根源。

修复

停止占用端口的进程,或启用 SO_REUSEADDR 并保证每个端口只有一个绑定者。避免重复启动实例,必要时给 TIME_WAIT 套接字一点时间清空。

验证

再次绑定确认服务器启动,并确认端口上只有一个监听进程。单一监听者且启动成功即证明修复。

常见陷阱

在多进程服务器里让每个 worker 绑定同一端口会冲突;应让主进程绑定或按进程分配端口。