我有一个用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
运行服务器后端口是否会被阻塞一段时间?如果是这样,是否有办法查询端口是否被阻塞并等待它被解除阻止,如果我想在它退出后立即重新启动服务器?
答案 0 :(得分:9)
您需要在绑定前设置SO_REUSEADDR
。
setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
如果不这样做可能会阻止套接字绑定,从而导致accept
时出错。如果你没有在第一个块中阻塞异常,你会注意到这个错误。