Python UDP套接字在recvfrom()上立即抛出错误

时间:2014-09-10 01:27:36

标签: python sockets

我正在尝试用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并阻塞了,所以我对这有什么区别感到有些困惑。

2 个答案:

答案 0 :(得分:0)

有很多可能的原因。

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

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

查看此link了解详情。

你需要调查它以弄清楚究竟发生了什么。我没有你的环境所以我找不到真正的问题。 希望这会有所帮助。

答案 1 :(得分:0)

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