我的Raspberry Pi上运行了一个小服务器,可以监听特定端口。但是,每当连接期间发生异常并且连接终止时,似乎对端口的分配不是"未绑定"。
这是一个示例代码:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 5005))
s.listen(1)
with s.accept()[0] as c:
raise Exception() # Act as if anything goes wrong
当我第一次运行它并在另一个终端上执行telnet localhost 5005
时,建立连接并且服务器按预期引发异常。
但是,当我尝试再次运行它时,我收到此错误:
Traceback (most recent call last):
File "testsocketexception.py", line 4, in <module>
s.bind(('', 5005))
OSError: [Errno 98] Address already in use
即使在服务器上引发异常,如何确保套接字未绑定? (顺便说一句,这似乎不会发生在Windows中。)
答案 0 :(得分:4)
在绑定套接字之前设置SO_REUSEADDR
套接字选项。
SO_REUSEADDR
标志告诉内核重用本地套接字TIME_WAIT
状态,无需等待其自然超时到期。
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 5005))
...
注意:即使您应用了此错误,如果上次运行中仍保留TIME_WAIT
套接字(没有SO_REUSEADDR
选项),也会收到错误。