gpt4 book ai didi

python - 如何在 python 中处理损坏的管道(SIGPIPE)?

转载 作者:行者123 更新时间:2023-12-04 19:29:20 27 4
gpt4 key购买 nike

我用 python 编写了一个简单的多线程游戏服务器,它为每个客户端连接创建一个新线程。我发现,由于管道/SIGPIPE 错误,服务器会时不时地崩溃。我很确定当程序尝试将响应发送回不再存在的客户端时会发生这种情况。

有什么好的方法来解决这个问题?我首选的解决方案是简单地关闭与客户端的服务器端连接并继续前进,而不是退出整个程序。

PS:This问题/答案以通用方式处理问题;我应该如何具体解决它?

最佳答案

假设您使用的是标准套接字模块,您应该会看到 socket.error: (32, 'Broken pipe')异常(不是其他人建议的 IOError )。这将在您描述的情况下提出,即发送/写入远程端已断开连接的套接字。

import socket, errno, time

# setup socket to listen for incoming connections
s = socket.socket()
s.bind(('localhost', 1234))
s.listen(1)
remote, address = s.accept()

print "Got connection from: ", address

while 1:
try:
remote.send("message to peer\n")
time.sleep(1)
except socket.error, e:
if isinstance(e.args, tuple):
print "errno is %d" % e[0]
if e[0] == errno.EPIPE:
# remote peer disconnected
print "Detected remote disconnect"
else:
# determine and handle different error
pass
else:
print "socket error ", e
remote.close()
break
except IOError, e:
# Hmmm, Can IOError actually be raised by the socket module?
print "Got IOError: ", e
break

请注意,第一次写入已关闭的套接字时并不总是会引发此异常 - 更常见的是第二次写入(除非在第一次写入中写入的字节数大于套接字的缓冲区大小)。您需要记住这一点,以防您的应用程序认为远程端在可能已经断开连接时从第一次写入接收到数据。

您可以使用 select.select() 减少这种情况的发生率(但不能完全消除)。 (或 poll )。在尝试写入之前检查准备好从对等方读取的数据。如果 select报告有可从对等套接字读取的数据,使用 socket.recv() 读取它.如果这返回一个空字符串,则远程对等方已关闭连接。因为这里仍然存在竞争条件,所以您仍然需要捕获并处理异常。

Twisted 非常适合这类事情,但是,听起来您已经编写了相当多的代码。

关于python - 如何在 python 中处理损坏的管道(SIGPIPE)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68163557/

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