12

我有一个用 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

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

4

1 回答 1

10

您需要SO_REUSEADDR在绑定之前进行设置。

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

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

于 2013-02-13T20:45:19.393 回答