动态调整大小的boost :: asio :: buffer

时间:2011-05-08 22:16:33

标签: c++ dynamic buffer boost-asio

我正在读这样的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来接受(理论上)有用量的输入并将其存储在容器中?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

似乎没有动态调整大小的任何规定。而且不会有意义。想想会发生什么:

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

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

答案 3 :(得分:0)

Boost 1.66.0添加了dynamic_buffer,可以调整对std::stringstd::vector<CharType>的引用: