如果我在上一次运行退出后立即重新启动,则socket.accept()中的参数异常无效

时间:2013-02-13 20:43:45

标签: python sockets

我有一个用python编写的客户端服务器架构。大部分时间它工作正常,但有时,在我停止服务器并在之后立即重新启动它时,我收到以下错误:

接受失败,原因是:22消息无效参数,错误:[Errno 22]参数无效

然而,如果我等待几分钟并再次启动相同的脚本而没有任何更改,它可以正常工作。

这是我在服务器上用来接受来自客户端的传入连接的循环:

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('',port))
    s.listen(1)
except:
    #logError()

while True:
    try:
        conn, address = s.accept() #THIS ACCEPT FAILS SOMETIMES
        multiprocessing.Process(target=HandleConnection, args=(conn, address, messageQueue, taskQueue, IOLock, numberOfConnections, numberOfConnectionsLock,resultsDirectory)).start()
    except socket.error, msg:
      #logError()  -> this except catches the error

运行服务器后端口是否会被阻塞一段时间?如果是这样,是否有办法查询端口是否被阻塞并等待它被解除阻止,如果我想在它退出后立即重新启动服务器?

1 个答案:

答案 0 :(得分:9)

您需要在绑定前设置SO_REUSEADDR

setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

如果不这样做可能会阻止套接字绑定,从而导致accept时出错。如果你没有在第一个块中阻塞异常,你会注意到这个错误。