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

时间:2016-04-18 09:53:57

标签: 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 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中。)

1 个答案:

答案 0 :(得分:4)

在绑定套接字之前设置SO_REUSEADDR套接字选项。

  

SO_REUSEADDR标志告诉内核重用本地套接字   TIME_WAIT状态,无需等待其自然超时到期。

     

from socket documentation

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选项),也会收到错误。