接收环形缓冲区 vs 简单缓冲区

3
我正在开发一个客户端-服务器应用程序。我的应用程序使用可变大小的数据包,每个数据包都有一个头部和可变长度的有效载荷。
我的困境是在进行接收时如何处理这些数据包。我遇到的大多数教程建议使用环形缓冲区,但据我所知,使用一个大小为最大可处理数据包两倍的缓冲区更有效。
如果我使用环形缓冲区,我需要一个额外的缓冲区来接收数据,然后我需要将缓冲区复制到环形缓冲区中,这意味着我需要进行一次或两次memcpys才能将缓冲区插入到环形缓冲区中。
如果我使用单个缓冲区方法,我只需要一个缓冲区,可以将其传递给recv调用,并在获取完整数据包且缓冲区中仍有属于另一个数据包的数据时使用memmove调用将数据移动到缓冲区的起始位置。
我是否理解错了?
PS. 如果您能指向任何处理可变长度数据包的源代码/示例,那将非常有帮助。

@KarolyHorvath 这是TCP。 - John Retallack
1个回答

1
如果我使用环形缓冲区,我需要一个额外的缓冲区来接收数据,然后我需要将缓冲区复制到环形缓冲区中,这意味着我需要进行一到两次内存复制操作才能将缓冲区插入到环形缓冲区中。
是的,两个读写操作,没什么大不了的(*). 但是你不需要额外的缓冲区。对于读取操作,只需将读取最大化到环形缓冲区末尾剩余的空间即可。
(*): 如果你担心额外系统调用的成本,对于散布/聚集读写,有recvmsgsendmsg

是的,我可以使用环形缓冲区的可用空间作为len参数调用recv函数,但这意味着我会失去一些吞吐量,因为我可能会以非常小的值调用recv函数。 - John Retallack
见(*)。而且这可能并不重要。这些优化只在极高性能的服务器上才有意义。 - Karoly Horvath
你说得没错。但我仍然不明白使用环形缓冲区相比简单缓冲区有什么优势。 - John Retallack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接