我有一个用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)
运行服务器后端口是否会被阻塞一段时间?如果是这样,是有办法查询,如果口堵住,等待,直到它的畅通,如果我想之后立即它只是退出再次启动服务器吗?
你需要SO_REUSEADDR在绑定之前设置.
setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)
如果不这样做可能会阻止套接字绑定,从而导致错误accept.如果你没有在第一个块中阻塞异常,你会注意到这个错误.