我正在开发一个客户端 - 服务器应用程序。我的应用程序正在使用可变大小的数据包,每个数据包都有一个标头和一个可变长度的有效负载。
我的困境是在执行recv时处理数据包的最佳方法是什么。 我遇到的大多数教程建议使用环形缓冲区,但据我所知,使用缓冲区的效率更高,缓冲区的大小是您可以处理的最大数据包的两倍。
如果我使用环形缓冲区,我需要一个额外的缓冲区用于recv然后我需要在环形缓冲区中复制缓冲区,这意味着我需要做一个或两个memcpys来将缓冲区插入环形缓冲区
如果我使用单缓冲区方法,我只需要一个可以传递给recv调用的缓冲区和一个memmove调用,当我得到一个完整的数据包并且还有属于另一个数据包的数据时,将数据移动到缓冲区的开头在缓冲区。
我出错了吗?
PS。如果您可以指向我处理任何可能有用的可变长度数据包的源代码/示例。
答案 0 :(得分:1)
如果我使用环形缓冲区,我需要一个额外的缓冲区用于recv然后我需要在环形缓冲区中复制缓冲区,这意味着我需要做一个或两个memcpys来将缓冲区插入环形缓冲区
是的,两次读写,没什么大不了的(*)。但是你不需要额外的缓冲区。对于读取,只需最大化读取到剩余空间直到环形缓冲区结束。
(*):如果您担心额外系统调用的成本,对于分散/聚集读/写,有recvmsg
和sendmsg
。