2012-03-19 146 views
0

我正在处理客户端服务器应用程序。我的应用程序正在处理可变大小的数据包,每个数据包都有一个头部和一个可变长度的有效载荷Recv环形缓冲区vs简单缓冲区

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

如果我使用环形缓冲器我需要的recv附加的缓冲,然后我需要缓冲器复制在环形缓冲器,这意味着我需要做一个或两个memcpys插入缓冲器在环形缓冲器

如果我使用单缓冲区方法,则只需要一个缓冲区,我可以将它传递给recv调用,当memoove调用将数据移动到缓冲区的起始处时,当我得到一个完整的数据包时,仍然有数据属于另一个数据包缓冲。

我错了吗?

PS。如果您可以指向任何源代码/示例,其中处理可变长度数据包将有所帮助。

+0

这是TCP还是UDP? – 2012-03-19 17:42:20

+0

@KarolyHorvath它的TCP – 2012-03-19 17:47:16

+1

为什么投票? – 2012-03-19 18:35:49

回答

1

如果我使用环形缓冲器我需要的recv附加的缓冲,然后我需要缓冲器复制在环形缓冲器,这意味着我需要做一个或两个memcpys插入缓冲器在环形缓冲器

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

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

+0

是的,我可以调用recv与len =环形缓冲区的可用空间,但这意味着我会失去一些吞吐量,因为我可以结束调用recv的长度参数为 – 2012-03-19 18:25:23

+0

的非常小的值参见(*)。这可能没有关系。这些优化只在极高性能的服务器中很重要。 – 2012-03-19 19:20:25

+0

你是对的。但我仍然不明白在简单缓冲区上使用环形缓冲区有什么优点 – 2012-03-19 19:36:08