SO_REUSEADDR仅允许重用处于TIME_WAIT状态的端口,无法解决活跃进程占用、多实例绑定冲突或容器端口映射未释放等问题;需配合lsof/ss排查真实占用者。

这个错误意味着你试图绑定一个已被占用的端口,常见于服务重启或开发调试阶段。直接改用 SO_REUSEADDR 选项就能解决,但必须在 bind() 之前设置,且不同操作系统行为略有差异。
为什么 bind() 会报 Address already in use?
根本原因不是端口真被其他进程占着,而是前一次连接处于 TIME_WAIT 状态(TCP 四次挥手后保留约 2~4 分钟),内核禁止立即复用该地址+端口组合。即使进程已退出,系统仍认为它“逻辑上还在”。
另一个常见原因是:上一次程序崩溃没正常关闭 socket,或者你忘了调用 close(),导致文件描述符泄漏,端口实际仍被持有。
如何用 setsockopt() 正确启用端口复用?
关键是在 bind() 前对 socket 对象调用 setsockopt(),传入 SOL_SOCKET 和 SO_REUSEADDR。Windows、Linux、macOS 都支持,但语义稍有不同:
Linux/macOS 下它允许重用处于 TIME_WAIT 的地址;Windows 下还允许多个 socket 绑定同一端口(需配合 SO_EXCLUSIVEADDRUSE 控制)。
import socket
<p>sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill5288" title="提示词大师-python版"><img
src="https://img.php.cn/upload/skill/000/000/081/179042051830184.jpg" alt="提示词大师-python版" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill5288" title="提示词大师-python版">提示词大师-python版</a>
<p>图片提示词生成器?不止如此。
马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。
用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。
用得越多,它越快:缓存机制让后续对话越来越省。
RAG进化:成功案例持续入库,越跑越聪明。
输入「新手指南」查看完整功能介绍</p>
</div>
<a href="/xiazai/skill5288" title="提示词大师-python版" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p><h1>必须在 bind() 之前设置</h1><p>sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('localhost', 8080))
sock.listen(5)-
SO_REUSEADDR的值是整数1,不是布尔值True - UDP socket 同样适用该设置,尤其在快速重启监听时
- 如果用的是
socket.create_server()(Python 3.11+),它默认启用了SO_REUSEADDR,不用手动设
哪些情况 setsockopt() 也救不了?
加了 SO_REUSEADDR 还报错,说明问题不在 TIME_WAIT,得查真实占用:
- 用
lsof -i :8080(macOS/Linux)或netstat -ano | findstr :8080(Windows)确认是否有残留进程 - 检查是否多个线程/进程同时尝试 bind 同一地址——这和复用无关,是竞态问题
- 确认没有其他脚本或 IDE 自动运行了相同服务(比如 VS Code 的 Python 调试器常后台驻留)
- 某些云环境或容器中,端口映射配置可能让本地端口看似“被占”,实际要查宿主机或网络策略
真正容易被忽略的是:很多开发者只记得加 SO_REUSEADDR,却没意识到它不解决“进程没退出”或“多处重复启动”的问题。端口复用只是绕过 TCP 状态限制,不是万能锁。动手前先 ps aux | grep python 或任务管理器扫一眼更省时间。


















