【问题标题】:Python - are sockets and recv() blocking by defaultPython - 默认情况下是套接字和 recv() 阻塞
【发布时间】:2020-08-20 05:07:29
【问题描述】:

我在网上看到很多关于 socket recv() 的例子都遵循这种格式:

来自here 的示例。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 50000))
s.listen(1)
conn, addr = s.accept()
while 1:
    data = conn.recv(1024)
    if not data:
        break

这里的代码并没有将socket设置为非阻塞;它也没有设置超时。我的理解是recv() 默认是阻塞的。如果是这样,代码如何到达break,因为如果没有数据,那么它会停留在recv()

编辑:处理“没有更多数据”的正确方法是什么?是将套接字设置为超时还是非阻塞;还是有其他方法?

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    根据this,如果对等方关闭或断开连接,recv 可能会返回一个空字符串(因此是错误的)。换句话说,使用阻塞recv函数继续接收数据,直到对端断开连接,然后离开循环。

    响应您的编辑:通常,如果不再发送数据,则不再发送数据的机器会发送最后一条消息,告诉服务器没有更多数据要接收,否则就结束连接你会得到你的空字符串。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2019-01-25
      • 2011-01-18
      相关资源
      最近更新 更多