Прочетете данни в кръгъл буфер

Възможно ли е да се използва boost::circular_buffer с boost::asio?

По-конкретно искам да прочета фиксиран брой байтове с boost::asio::async_write и да ги съхраня директно в кръговия буфер без копиране.

Някакъв примерен код би бил много добър!


person Robert Hegner    schedule 08.11.2013    source източник
comment
да, можеш. Някакъв примерен код би бил добър.   -  person Theolodis    schedule 08.11.2013
comment
Вижте следните членове на circular_buffer: _ 2 _ , array_two, < a href="http://tinyurl.com/lmg2axt" rel="nofollow noreferrer">rotate и linearize . Можете да използвате array_one() и array_two(), за да получите вътрешни буфери (отрезки от един голям буфер) и да захранвате boost::asio::buffer с тях.   -  person Evgeny Panasyuk    schedule 09.11.2013
comment
Благодаря на @EvgenyPanasyuk за тези съвети. Ще опитам в понеделник, ако успея да го накарам да работи с променлива буферна последователност, състояща се от array_one и array_two.   -  person Robert Hegner    schedule 09.11.2013
comment
Не изглежда, че има приемлив отговор за това.   -  person Glenn    schedule 23.01.2016
comment
Здравей, @RobertHegner разбра ли някога това?   -  person schuess    schedule 25.05.2017
comment
Сигурни ли сте, че искате да четете с async_write?   -  person rustyx    schedule 29.12.2017


Отговори (1)


Към момента (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);
person rustyx    schedule 31.12.2017