我正在使用socket(AF_UNIX, SOCK_STREAM)
套接字在两个进程之间进行通信。
我希望接收器能够接收上限字节数,其中上限非常大(在16MB到64MB范围内)。也就是说,我希望收到一个最多[cap]字节的消息,如果消息大于那个,我想停止接收或丢弃剩余的消息。
从文档中,这样做的方法似乎是使用socket.recv(bufsize=[cap])
。但是有以下说明:
注意为了最好地匹配硬件和网络现实,bufsize的值应该是2的相对较小的幂,例如,4096。
这表明缓冲区大小并非用于此目的。那么,实现这一目标的最佳方式是什么?
答案 0 :(得分:1)
您应该使用循环,如此ActiveState recipe中所示。
根据您引用的文档,bufsize
参数最好保留默认值。只需调用recv
并将收到的字节字符串添加到您自己的缓冲区,直到满足以下条件之一:
recv
返回一个空值。这意味着另一端已关闭连接
您的缓冲区达到其允许的最大大小(您正在谈论的容量)
引发异常。这可能意味着连接已被非正常关闭 - 检查错误代码
请注意,如果您事先不知道要接收的字节数,recv
将会阻止。让客户端事先发送邮件大小以避免此问题。但请记住,如果连接延迟,您recv
仍然可以阻止。使用timeouts并注意循环中的第4个停止条件。