Python中socket.error: [Errno 98] Address already in use报错如何解决?
昨天早上梯子突然不可用了,昨晚看了一下进程都很正常啊。
但是重启的时候会报一个错,查 log 发现是标题的问题。
kill 了 python 所有的 pid,重启 ss 后正常了....但是还是很想知道这个报错是怎样引起的.
Python中socket.error: [Errno 98] Address already in use报错如何解决?
10 回复
绑定端口的时候发现端口被占用了
这个错误是因为端口被占用了。简单说就是你想绑定的地址和端口已经被其他进程用了。
解决起来很简单,在创建socket后设置一下SO_REUSEADDR选项就行:
import socket
# 创建socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 关键在这里:设置SO_REUSEADDR为True
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 现在绑定就不会有Address already in use错误了
sock.bind(('localhost', 8080))
sock.listen(5)
SO_REUSEADDR告诉内核:即使这个端口还处于TIME_WAIT状态(通常是之前连接关闭后的等待期),也允许重新绑定。TIME_WAIT大概会持续1-4分钟,这是TCP协议的正常行为,但开发时频繁重启服务器就会碰到这个问题。
如果你在Linux/Mac上,也可以用命令行快速杀掉占用端口的进程:
# 找到占用8080端口的进程
lsof -i :8080
# 或者用
netstat -tulpn | grep :8080
# 然后kill掉对应的PID
kill -9 <PID>
不过最省事的还是在代码里加setsockopt那一行,一劳永逸。
总结:加个socket选项重用地址就行。
TIMEWAIT 状态
感谢回复。但是我就这么一个服务,没有其他服务欸。
#3 参考二楼, 关闭服务并不会马上释放端口, 而进入 TIMEWAIT 状态, 所以之前的端口没有被释放
netstat -lntp 看下是不是有相同端口的程序存在!或者直接换个端口再启动!
明白了,谢谢。
macos 特别小的宽口 比如 80 是 关闭的, *inx 的话 就是端口被占着呢
沒開服務當然是關閉的,和端口數小有什麼關係?
linux lsof -i:端口号 可以看那个程序在占用这个端口

