gpt4 book ai didi

python - 为什么 recv 在接收到所有数据之前不阻塞?

转载 作者:太空狗 更新时间:2023-10-29 20:44:14 25 4
gpt4 key购买 nike

为什么 recv 系统调用不阻塞直到接收到所有数据?每次我看到 recv 调用时,它都处于一个 while 循环中,它一直在调用 recv 直到所有数据都存在。为什么不首先使用 recv block ?

最佳答案

您可以使用 MSG_WAITALL 标志请求 recv block ,直到收到所有数据。但是,如果信号到达,已经执行了一些工作(即接收部分数据)的系统调用不能自动重新启动以接收其余部分。因此,即使使用 MSG_WAITALL,在某些情况下 recv 调用可能会在缓冲区满之前返回,您必须准备好处理这些情况。鉴于此,许多人只是选择循环,而不去理会鲜为人知的标志,例如 MSG_WAITALL

至于为什么默认情况下会出现这种情况,我想到了以下几个原因:

  • 您经常希望接收部分阅读。例如,如果您在数据传入时递增地显示它,或者如果您将它代理到其他地方,或者如果数据太大而您无法一次将整个数据缓冲到内存中。毕竟,如果您只是立即写入文件,您是否关心将其分成 200 次而不是 150 次写入?
  • 有时您甚至不知道一开始需要多少数据。考虑一下 telnet 协议(protocol),它在设计 BSD 套接字 API 时很流行。您通常会一次接收少量字节,没有长度字段告诉您预期有多少数据,而且您需要立即显示该数据。在此处填充缓冲区之前,阻塞是没有意义的。与面向线路的协议(protocol)(如 SMTP 或 IMAP)类似 - 在收到所有命令之前,您不知道命令有多长。
  • recv 通常用于数据报套接字,它接收单个数据报,即使它比提供的缓冲区小得多。流式套接字的自然扩展是尽可能多地返回而无需等待。

但最重要的是,由于您需要准备好处理部分缓冲区无论如何,强制人们默认处理它是很好的,这样他们就可以尽早发现循环中的错误- 而不是让他们一直躲起来,直到信号在不幸的时刻到达。

关于python - 为什么 recv 在接收到所有数据之前不阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com