Skip to main content
 首页 » 编程设计

python之从套接字接收上限字节数的最佳方法是什么

2025年05月04日8mfryf

我正在使用 socket(AF_UNIX, SOCK_STREAM) 套接字在两个进程之间进行通信。

我希望接收方接收有上限的字节数,上限相当大(在 16MB 到 64MB 范围内)。也就是说,我想接收最多 [cap] 字节的消息,如果消息大于该字节,我想停止接收或丢弃消息的其余部分。

根据文档,执行此操作的方法似乎是使用 socket.recv(bufsize=[cap])。但有以下注意事项:

Note For best match with hardware and network realities, the value of bufsize should be a relatively small power of 2, for example, 4096.

这表明缓冲区大小并非用于此目的。那么,实现这一目标的最佳方法是什么?

请您参考如下方法:

您应该使用一个循环,如 ActiveState recipe 中所示.

根据您引用的文档,bufsize 参数最好保留为默认值。只需调用 recv 并将接收到的字节字符串添加到您自己的缓冲区,直到满足以下条件之一:

  • recv 返回空值。这意味着另一端已经关闭了连接

  • 您的缓冲区达到其最大允许大小(您所说的容量)

  • 引发异常。这可能意味着连接已被不正常地关闭 - 检查错误代码

请注意,如果您事先不知道要接收多少字节,recv 将阻塞。让客户端事先发送消息大小以避免此问题。但请记住,如果连接缓慢,您的 recv 仍然会阻塞。使用 timeouts并在您的循环中观察第 4 个停止条件以确保确定。