2014-01-22 33 views
2

我正在使用socket(AF_UNIX, SOCK_STREAM)套接字在两个进程之间进行通信。从套接字接收字节数的最佳方式是什么?

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

从文档中,这样做的方式似乎是使用socket.recv(bufsize=[cap])。但有以下注意事项:

注意对于使用的硬件和网络的现实最佳匹配,BUFSIZE的值应该是2的功率相对较小,例如,4096

这表明,缓冲区大小不是为此目的而设计的。那么,实现这个目标的最好方法是什么?

+0

你不能只是收到字节,因为他们收到至少(至少4k)字节后,至少(4k)字节,调用recv()剩下什么? TBH,我完全不理解你的要求,或者'消息'是什么。 –

回答

1

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

根据所引用的文档,bufsize参数最好保留其默认值。只需拨打recv和接收的字节字符串添加到您自己的缓冲区,直到其中一个条件得到满足:

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

  • 你的缓冲区达到其最大允许大小

  • 抛出一个异常(你所谈论的容量)的连接。这可能意味着连接已关闭非正常 - 检查错误代码

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

+0

谢谢。我不能依靠发件人优雅地关闭连接,所以事先发送大小是一个很好的建议。有了这个和/或你链接到的循环,我想我可以得到我需要的东西。 – capitalistcuttle

相关问题