python - Python UDP套接字在recvfrom()上引发立即错误

标签 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并将其阻止,因此我对其中的区别感到困惑。

最佳答案

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

关于python - Python UDP套接字在recvfrom()上引发立即错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755973/

相关文章:

python - 获取与同一个表中的父元素相关的子元素

python - 如何使用 Statsmodels 库从 Pandas 数据框创建马赛克图?

python - 使用 django-admin.py 时出错

c - recv() 中使用的字符串不像它应该的那样 printf

python - py.test SetUp/TearDown 用于整个测试套件

python - 哪个编辑器/IDE 最适合为 Google App Engine 编辑 Python 脚本?

java - 如果我尝试通过 DatagramChannel 发送空 UDP 数据包但底层套接字缓冲区已满,会发生什么情况?

c++ Socket选择接收问题

使用套接字上传Java文件,需要上传文件的百分比?

linux - 从原始套接字接收失败