13

我正在使用 Python 并在给定端口上侦听 UDP 数据包,一切似乎都运行良好 - 但经过一段时间后脚本崩溃并出现以下错误:

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

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

关于事物的套接字方面,我正在做:

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) )

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

提前感谢您提供的任何信息!

本吉

4

2 回答 2

13

UDP 套接字上的“Connection reset by peer”错误,表示客户端在其发送的数据包上从服务器收到了 ICMP 错误消息(例如:端口不可达、超出 TTL 等)。

我不能确定是什么导致您的代码出现这种情况,但我可以提供两个想法:

  1. 连接确实被某些东西(路由问题、服务器端故障等)中断了。在这种情况下,您可以检查此错误,如果以及何时发生,您可以重新打开您的套接字。
  2. 对我来说似乎更有可能但我不太熟悉的SO_REUSEADDR是导致问题的原因。此套接字选项允许您在同一端口上打开多个套接字。可能发生的情况是,其他进程正在尝试使用端口 6000,成功(因为您告诉操作系统不要阻止它),并且您的套接字被操作系统关闭。由于我看不出SO_REUSEADDR在 UDP 套接字上使用的理由,我建议您删除该行sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)并重试。

祝你好运!

于 2012-10-10T08:39:40.490 回答
0

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

我通过修复 HTTP 请求中的参数解决了这个问题。对于我的实例,我最初有一个 Content-Type: application/dns-message,后来我将其更改为 Accept: application/dns-message。

希望这可以帮助遇到类似问题的任何人。

于 2021-10-28T02:36:05.100 回答