Python中的“Connection reset by peer”

14

我在尝试使用Python监听给定端口的UDP数据包,一切似乎都很顺利,但是在长时间运行后,脚本会因以下错误而崩溃:

data = self._sock.recv(self._rbufsize)
socket.error: [Errno 54] Connection reset by peer

当仅重新启动脚本时,同样的崩溃会在较短的时间内再次发生。相反,重新启动服务器似乎可以完全解决问题一段时间。

关于 socket 方面,我正在执行:

UDP_IP = "0.0.0.0"
UDP_PORT = 6000

sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind( (UDP_IP, UDP_PORT) )

我是否漏掉了一些明显的东西,或者有没有一种简单的方法可以避免这种情况?

非常感谢你能提供的任何帮助!

Benji

2个回答

13
在UDP套接字上出现“Connection reset by peer”错误,这意味着客户端已收到来自服务器的ICMP错误消息(例如:端口不可达,TTL超时等)并且针对发送的数据包。

我不能确定您的代码中是什么原因导致此问题,但我可以提供两个想法:

  1. 连接确实被某些事情打断(路由问题,服务器故障等)。在这种情况下,您可以检查此错误,并在发生时重新打开套接字。
  2. 我认为更可能的是,但我不太熟悉的是,SO_REUSEADDR引起了问题。此套接字选项允许您在同一端口上打开多个套接字。可能发生的情况是,某个其他进程正在尝试使用端口6000并成功(因为您告诉操作系统不要阻止它),然后操作系统关闭您的套接字。由于我不认为需要在UDP套接字上使用SO_REUSEADDR,建议您删除该行sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)并重试。

祝好运!


0

这可能不是最相关的,但我在尝试向DNS(DoH)解析器发送HTTP GET请求(使用Python套接字)时遇到了相同的 ErrNo54 或 ErrNo104 Connection Reset by peer 错误。

我通过修正我的HTTP请求参数来解决了这个问题。在我的情况下,我最初使用的是 Content-Type: application/dns-message,后来我将其更改为 Accept: application/dns-message。

希望这能帮助那些遇到类似问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接