如果上次运行后立即重启,socket.accept()中出现无效参数异常

13 投票
1 回答
15014 浏览
提问于 2025-04-17 15:48

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

10

你需要在绑定之前设置 SO_REUSEADDR

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

如果不这样做,可能会导致套接字无法绑定,这样在调用 accept 时就会出现错误。如果你没有在第一块代码中处理异常,你可能会注意到这个错误。

撰写回答