c++ - asio::streambuf 优于原始数组的优势

标签 c++ arrays boost-asio streambuf

我不太明白使用 streambuf 相对于常规数组的优势。 让我解释一下我的问题。我有一个使用 Rijndael 128 ECB + 一些简单密码加密的网络连接,用于加密小于 16 字节的剩余数据。数据包的结构为 length_of_whole_packet+operationcode+data。我必须实际复制 streambuf 中的所有数据,以便我可以应用解密算法?为什么要再制作一份我已有的数据拷贝?

我在发送数据时遇到了同样的问题。在安全模式下,数据包结构为 length_of_whole_packet+crc+data,其中 crc 和数据已加密。我可以做一些像 MakePacket(HEADER, FORMAT, ...) 这样的怪物,它会分配数组、格式化数据包、添加 crc 并加密它,但我想避免使用 vararg 函数。我不能使用结构,因为数据包具有动态长度,因为其中可以有数组或字符串。如果我使用 MakePacket(unsigned char opcode, &streambuf sb) 那么 crc 会再次出现问题 -> 必须制作一个拷贝来加密它。

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

我不太确定如何设计这种避免数据拷贝的通信。

谢谢你的回答。

最佳答案

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

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

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

  • 可以将固定长度的正文读入 boost::array
  • 固定长度 header 包含足够的信息来确定以下可变长度主体的长度可以使用 std::vector 读取固定大小的 header ,调整 vector 确定正文长度后,再阅读正文。

在问题的上下文中,如果 length_of_whole_packet 是固定长度,应用程序可以将其读入 std::vector,调整 vector 的大小code> 根据确定的主体长度,然后将剩余数据读入vector。然后,解密算法可以直接在 vector 上运行,并使用输出迭代器,例如 std::back_insert_iterator,如果算法不能在-地方。对要写入的数据进行加密也是如此。

关于c++ - asio::streambuf 优于原始数组的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328522/

相关文章:

c++ - 将新子目录添加到 HKEY_LOCAL_MACHINE\Software\Classes 后如何更新 HKEY_CLASSES_ROOT

c++ - 如果大小未知,如何通过引用将一维数组作为参数传递?

c++ - boost::asio 的扩展被中断后挂起

C++Boost.ASIO : passing accepted TCP connection from one opened socket to another using Windows APIs ( while works with Linux APIs)?

c++ - C++ 中的 "Variable ' i ' was not declared in scope "是什么?

c++ - memcpy 在尝试 ‘fast’ pimpl 期间未优化

arrays - Haskell 中的移动平均线

c - 从控制台读取未知长度的字符串

c++ - Boost.Asio deadline_timer 没有按预期工作

c++ - 代码行为很奇怪