动态大小的提升::asio::buffer

Dynamically sized boost::asio::buffer

本文关键字:asio buffer 动态      更新时间:2023-10-16

我正在从这样的boost::asio::ip::udp::socket中阅读:

using boost::asio::ip::udp;
// ...
char recv_buf[128];
udp::endpoint sender_endpoint;
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);

现在,这工作得很好,但我能够接收的最大字符数现在是 127。但是,我遇到了一个问题,因为我需要接受一些长度可以有很大变化的数据输入(例如,长度不是带有前缀标头的明确定义的长度)。对此的解决方案是动态扩展缓冲区,如向量。是否可以创建一个动态扩展的boost::asio::buffer来接受(理论上)输入量并将其存储在容器中?

UDP 数据报大小变化不大:它永远不会大于 65535,在 8 字节标头之后留出 65,527 字节数据的空间。

Boost 1.66.0 添加了dynamic_buffer,它可以适应std::stringstd::vector<CharType>的引用:

  • http://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/dynamic_buffer.html

如果使用较小的缓冲区,则可以通过 *BufferSequences 概念轻松地将它们链接在一起。例如,您可以传入 MutableBufferSequence 接受来自 read(2) 调用的数据,或为要写出的 (2) 缓冲区列表传递 ConstBufferSequence。也就是说,我倾向于建议在每个方向上使用单个缓冲区,因为它倾向于简化代码(尽管这并不总是可能的)。

似乎没有任何关于动态大小调整的规定。 而且不会有是有道理的。 想想必须发生什么:

  • 单个 UDP 数据报只能接收一次,因此:
  • 提供给低级系统调用的缓冲区需要足够大,以便获得最大的有效消息,因此,
  • 为了提高效率,缓冲区必须由调用方预先分配。

因此,有一个动态大小的缓冲区可用是没有意义的。 正如 Cubbi 指出的那样,无论如何,UDP 数据报的最大大小都很小,因此只需将缓冲区与系统中最大的有效消息一样大,然后完成它。