Recv环缓冲区与简单缓冲区

时间:2012-03-19 17:29:12

标签: c sockets tcp circular-buffer

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

我的困境是在执行recv时处理数据包的最佳方法是什么。 我遇到的大多数教程建议使用环形缓冲区,但据我所知,使用缓冲区的效率更高,缓冲区的大小是您可以处理的最大数据包的两倍。

如果我使用环形缓冲区,我需要一个额外的缓冲区用于recv然后我需要在环形缓冲区中复制缓冲区,这意味着我需要做一个或两个memcpys来将缓冲区插入环形缓冲区

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

我出错了吗?

PS。如果您可以指向我处理任何可能有用的可变长度数据包的源代码/示例。

1 个答案:

答案 0 :(得分:1)

  

如果我使用环形缓冲区,我需要一个额外的缓冲区用于recv然后我需要在环形缓冲区中复制缓冲区,这意味着我需要做一个或两个memcpys来将缓冲区插入环形缓冲区

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

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