2016-04-18 48 views
2

我有一个运行在我的Raspberry Pi上的小服务器,它监听特定的端口。但是,无论何时在连接期间发生异常并且连接终止,看起来对端口的分配都不是“未绑定”。Python套接字编程:异常后的“地址已经在使用”

这是一个例子代码:

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中似乎不会发生。)

回答

4

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

the SO_REUSEADDR flag tells the kernel to reuse a local socket in TIME_WAIT state, without waiting for its natural timeout to expire.

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选项)。

+0

是的,它现在工作,谢谢! – elzell

相关问题