将数据读入循环缓冲区

8

能否使用boost::circular_bufferboost::asio一起使用?

具体地说,我想使用boost::asio::async_write读取固定数量的字节,并直接存储到循环缓冲区中而无需复制。

提供一些示例代码会非常好!


2
是的,你可以。提供一些示例代码会更好。 - Theolodis
1
请查看circular_buffer的以下成员:array_onearray_tworotatelinearize。您可以使用array_one()array_two()获取内部缓冲区(一个大缓冲区的切片),并将它们提供给boost::asio::buffer - Evgeny Panasyuk
感谢@EvgenyPanasyuk提供的提示。 我将尝试在周一用包含array_onearray_two的可变缓冲区序列中使其工作。 - Robert Hegner
这个问题似乎没有可接受的答案。 - Glenn
嗨,@RobertHegner,你解决了这个问题吗? - schuess
1
你确定要使用async_write进行读取吗? - rustyx
1个回答

2

目前(Boost 1.66),无法将数据读入boost::circular_buffer,因为它没有公开任何一种方法来保留底层缓冲区中的空间,这是创建mutable_buffer所需的先决条件,以便调用asio::read

但是可以从boost::circular_buffer写入

  boost::circular_buffer<char> cir_buf;

  FillBuffer(cir_buf);

  // Construct a buffer sequence with either 1 or 2 data chunks
  std::vector<boost::asio::const_buffer> buffer_sequence;

  auto arr1 = cir_buf.array_one();
  buffer_sequence.push_back(boost::asio::buffer(arr1.first, arr1.second));

  auto arr2 = cir_buf.array_two();
  if (arr2.second != 0) {
    buffer_sequence.push_back(boost::asio::buffer(arr2.first, arr2.second));
  }

  boost::asio::write(socket_, buffer_sequence);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接