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

Ale*_*der 11 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
Run Code Online (Sandbox Code Playgroud)

运行服务器后端口是否会被阻塞一段时间?如果是这样,是有办法查询,如果口堵住,等待,直到它的畅通,如果我想之后立即它只是退出再次启动服务器吗?

cni*_*tar 9

你需要SO_REUSEADDR在绑定之前设置.

setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)

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