asio :: streambuf优于原始数组

时间:2014-06-20 13:32:37

标签: c++ arrays boost-asio streambuf

我不太了解在常规数组中使用streambuf的优势。 让我解释一下我的问题。我有一个网络连接,使用Rijndael 128 ECB加密,一些简单的密码加密短于16字节的剩余数据。分组被构造为length_of_whole_packet +操作码+数据。我必须实际复制streambuf中的所有数据,以便我可以应用解密算法?为什么要制作我已有的另一份数据?

我发送数据的问题也一样。在securemode中,数据包结构是length_of_whole_packet + crc + data,其中crc和data是加密的。我可以制作一些怪物作为MakePacket(HEADER,FORMAT,...),它将分配数组,格式化数据包,添加crc并加密它,但我想避免使用vararg函数。我不能使用结构,因为数据包具有动态长度,因为它可以有数组或字符串。如果我使用MakePacket(unsigned char操作码和& streambuf sb)那么再次出现crc问题 - >必须制作副本才能对其进行加密。

我是否应该使用vararg monstrosity将常规数组作为缓冲区与unsigned char pbyRecvBuffer [BUFFERMAXLEN]一起用于recv?

我不确定如何设计此通信以避免数据副本。

谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

使用streambuf时,通常可以通过使用对迭代器进行操作的算法(例如std::istreambuf_iteratorboost::asio::buffers_iterator)来最小化数据复制,而不是从{{1}复制数据进入另一个数据结构。

对于类似流的应用程序协议,boost::asio::streambuf通常优于boost::asio::buffer()兼容类型,例如原始数组。例如,考虑HTTP,其中分隔符用于标识可变长度标题和主体之间的边界。更高级别的read_until()操作提供了一种优雅的方式来读取协议,因为Boost.Asio将处理内存分配,检测分隔符,并在达到消息边界后调用完成处理程序。如果应用程序使用原始数组,则需要读取块并将每个碎片块复制到聚合内存缓冲区中,直到找到相应的分隔符。

如果应用程序可以确定要读取的确切字节数,那么可能值得考虑对固定长度部分使用streambuf而对可变长度部分使用boost::array。例如,具有以下内容的应用程序协议:

  • 固定长度的身体可以读入std::vector
  • 包含足够信息以确定以下可变长度主体长度的固定长度标头可以使用boost::array来读取固定大小标头,一旦确定了主体长度,就调整std::vector的大小,然后阅读身体。

在问题的上下文中,如果vector具有固定长度,则应用程序可以将其读入length_of_whole_packet,根据确定的体长调整std::vector的大小,然后阅读将剩余数据存入vector。然后,解密算法可以直接在vector上运行,并使用输出迭代器(例如vector)和辅助输出缓冲区(如果算法不能就地完成)。加密要写入的数据也是如此。