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

时间:2014-01-22 19:25:19

标签: python sockets

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

我希望接收器能够接收上限字节数,其中上限非常大(在16MB到64MB范围内)。也就是说,我希望收到一个最多[cap]字节的消息,如果消息大于那个,我想停止接收或丢弃剩余的消息。

从文档中,这样做的方法似乎是使用socket.recv(bufsize=[cap])。但是有以下说明:

  

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 您的缓冲区达到其允许的最大大小(您正在谈论的容量)

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

请注意,如果您事先不知道要接收的字节数,recv将会阻止。让客户端事先发送邮件大小以避免此问题。但请记住,如果连接延迟,您recv仍然可以阻止。使用timeouts并注意循环中的第4个停止条件。