【问题标题】:Recv ring buffer vs simple bufferRecv 环形缓冲区与简单缓冲区
【发布时间】:2012-04-04 05:15:25
【问题描述】:

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

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

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

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

我是不是搞错了什么?

附言。如果您能指出任何处理可变长度数据包的源代码/示例,那将很有帮助。

【问题讨论】:

  • @KarolyHorvath 它是 TCP

标签: c sockets tcp circular-buffer


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我可以使用 len = 环形缓冲区的空闲空间调用 recv,但这意味着我会损失一些吞吐量,因为我可以用非常小的长度参数值来结束调用 recv
  • 见 (*)。这可能没关系。这类优化只在性能极高的服务器中很重要。
  • 你是对的。但我仍然不明白使用环形缓冲区比简单缓冲区有什么优势
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多