如果上次运行后立即重启,socket.accept()中出现无效参数异常
我有一个用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
时就会出现错误。如果你没有在第一块代码中处理异常,你可能会注意到这个错误。