【问题标题】:Python UDP socket throws immediate error on recvfrom()Python UDP 套接字在 recvfrom() 上立即抛出错误
【发布时间】:2014-09-10 01:27:35
【问题描述】:

我正在尝试在 Python 中进行一些简单的套接字编程。我在 Python 中有一个 UDP 服务器,它接受输入并发送响应。我的客户端代码有问题。

sock = socket.socket(
    socket.AF_INET, socket.SOCK_DGRAM
)
sock.bind(('0.0.0.0', 0))
sock.settimeout(2)
sock.sendto(json.dumps({
    'operation': operation,
    'operands': [operand1, operand2]
}), (host, port))

print sock.recvfrom(4096)

此代码在服务器运行时完美运行。但是,当我在没有服务器运行的情况下尝试它时,代码会立即抛出异常,而不是在 recvfrom() 上阻塞。

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

我想要的功能是在一段时间后超时。 谁能解释我做错了什么?我在服务器代码中使用 recvfrom 并且它会阻塞,所以我有点不明白有什么区别。

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    前面的大部分答案都不适用,因为您有 SOCK_DGRAM 类型,即。 e. UDP 套接字。 UDP 是一种无连接服务,即使错误消息涉及连接。发生异常是由于目的主机响应sendto数据报的通知,告知端口不可达;在您致电recvfrom 之前,不会处理此通知(甚至可能到达)。没有自动重试;您必须再次尝试recvfrom(也许还有sendto)并自己实现所需的超时。

    【讨论】:

      【解决方案2】:

      有很多可能的原因。

      套接字错误 [10054] 表示连接被对等方重置。

      现有连接被远程主机强行关闭。如果远程主机上的对等应用程序突然停止,主机重新启动,主机或远程网络接口被禁用,或者远程主机使用硬关闭,这通常会导致(有关远程主机上 SO_LINGER 选项的更多信息,请参阅 setsockopt插座)。如果在一个或多个操作正在进行时,由于保活活动检测到故障而导致连接中断,也可能导致此错误。正在进行的操作因 WSAENETRESET 而失败。后续操作因 WSAECONNRESET 而失败。

      查看link了解详情。

      您需要调查它以找出实际发生的情况。我没有你的环境,所以我找不到真正的问题是什么。 希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多