gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:06:13 25 4
gpt4 key购买 nike

我有一个用 python 编写的客户端服务器架构。大多数时候它工作正常,但有时,在我停止服务器并立即重新启动它之后,我收到以下错误:

Accept failed due to : 22 Message Invalid argument, error: [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

我运行服务器后端口是否被阻塞了一段时间?如果是这样,如果我想在服务器退出后立即再次启动服务器,是否有办法查询端口是否被阻塞并等待它被解除阻塞?

最佳答案

绑定(bind)前需要设置SO_REUSEADDR

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

如果不这样做可能会阻止套接字绑定(bind),从而在 accepting 时出现错误。如果您没有在第一个 block 中阻塞异常,您会注意到这个错误。

关于python - 如果我在上一次运行退出后立即重新启动,则 socket.accept() 中的无效参数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com