Python套接字编程:";“地址已在使用中”;例外之后

Python套接字编程:";“地址已在使用中”;例外之后,python,sockets,python-3.x,Python,Sockets,Python 3.x,我有一个小服务器在我的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 Excep

我有一个小服务器在我的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
回溯(最近一次呼叫最后一次):
文件“testsocketexception.py”,第4行,在
s、 绑定(('',5005))
OSError:[Errno 98]地址已在使用中
即使在服务器上引发异常,如何确保套接字未绑定?
(顺便说一句,这在Windows中似乎不会发生。)

在绑定套接字之前设置
以便重新使用eaddr
套接字选项

SO_REUSEADDR
标志告诉内核在中重用本地套接字
TIME\u WAIT
状态,无需等待其自然超时过期


注意:即使应用此选项,如果上次运行时仍保留
TIME\u WAIT
套接字(没有
SO\u REUSEADDR
选项),也会出现错误

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('', 5005))
    ...