【问题标题】:What is the best way to receive a capped number of bytes from a socket?从套接字接收上限字节数的最佳方法是什么?
【发布时间】:2014-01-22 19:25:19
【问题描述】:

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

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

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

注意为了与硬件和网络现实进行最佳匹配,bufsize 的值应该是 2 的相对较小的幂,例如 4096。

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

【问题讨论】:

  • 你不能只计算接收到的字节数,并且在接收到至少 (limit-4k) 个字节后,用剩余的内容调用 recv() 吗? TBH,我不完全理解你的要求,或者“信息”是什么。

标签: python sockets


【解决方案1】:

您应该使用循环,如 ActiveState recipe 中所示。

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

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

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

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

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

【讨论】:

  • 谢谢。我不能依赖发件人优雅地关闭连接,所以事先发送大小是一个很好的建议。有了那个和/或你链接到的循环,我想我可以得到我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2012-10-25
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多