Recv环形缓冲区与简单缓冲区

Recv环形缓冲区与简单缓冲区,c,sockets,tcp,circular-buffer,C,Sockets,Tcp,Circular Buffer,我正在开发一个客户端服务器应用程序。我的应用程序使用可变大小的数据包,每个数据包都有一个头部和一个可变长度的有效负载 我的难题是,在进行recv时,处理数据包的最佳方法是什么。 我遇到的大多数教程都建议使用环形缓冲区,但据我所知,使用一个大小是您能处理的最大数据包大小两倍的缓冲区更有效 如果我使用一个环形缓冲区,我需要一个用于recv的附加缓冲区,然后我需要在环形缓冲区中复制该缓冲区,这意味着我需要执行一个或两个memcpy来将该缓冲区插入环形缓冲区 如果我使用单缓冲区方法,我只需要一个缓冲区,

我正在开发一个客户端服务器应用程序。我的应用程序使用可变大小的数据包,每个数据包都有一个头部和一个可变长度的有效负载

我的难题是,在进行recv时,处理数据包的最佳方法是什么。 我遇到的大多数教程都建议使用环形缓冲区,但据我所知,使用一个大小是您能处理的最大数据包大小两倍的缓冲区更有效

如果我使用一个环形缓冲区,我需要一个用于recv的附加缓冲区,然后我需要在环形缓冲区中复制该缓冲区,这意味着我需要执行一个或两个memcpy来将该缓冲区插入环形缓冲区

如果我使用单缓冲区方法,我只需要一个缓冲区,当我得到一个完整的数据包并且在缓冲区中仍然有属于另一个数据包的数据时,我可以传递给recv调用和memmove调用,将数据移动到缓冲区的开始

我有什么不对劲吗

另外,如果你能给我指出任何处理可变长度数据包的源代码/示例,那将是很有帮助的

如果我使用一个环形缓冲区,我需要一个用于recv的附加缓冲区,然后我需要在环形缓冲区中复制该缓冲区,这意味着我需要执行一个或两个memcpy来将该缓冲区插入环形缓冲区

是的,两次读写,没什么大不了的(*)。但您不需要额外的缓冲区。对于读取,只需最大化对剩余空间的读取,直到环形缓冲区结束


(*):如果您担心额外系统调用的成本,对于分散/聚集读/写,有
recvmsg
sendmsg

@KarolyHorvath它是TCPyes,我可以使用len=环形缓冲区的可用空间调用recv,但这意味着我会失去一些吞吐量,因为我可以使用非常小的长度参数值结束调用recv,请参见(*)。这可能并不重要。这种优化只在性能极高的服务器上才起作用。你说得对。但我仍然不明白使用环形缓冲区比使用简单缓冲区有什么好处