我正在尝试用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并将其阻止,因此我对其中的区别感到困惑。
最佳答案
以前的大多数答案都不适用,因为您具有SOCK_DGRAM类型,即。 e。 UDP套接字。 UDP是无连接服务,即使错误消息中提到了连接。发生此异常是由于目标主机响应sendto
数据报而发出的通知,告知该端口不可达。在您调用recvfrom
之前,不会处理(甚至可能到达)此通知。没有自动重试;您必须再次尝试recvfrom
(也许还有sendto
)并自己实现所需的超时。
关于python - Python UDP套接字在recvfrom()上引发立即错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755973/