Как использовать std :: string с asio :: buffer () - PullRequest
12 голосов
/ 01 ноября 2010

Я получаю следующее сообщение об ошибке при попытке использовать std :: string с boost :: asio :: buffer:

boost / asio / detail / consuming_buffers.hpp: в конструкторе'boost :: asio :: detail :: consuming_buffers

:: consuming_buffers (const boost :: asio :: const_buffers_1 &)': boost / asio / impl / read.hpp: 140: 25:
создается из' boost :: asio :: detail :: read_op (*) ()>

:: read_op (boost :: asio :: basic_stream_socket &, const boost :: asio :: const_buffers_1 &, boost :: asio :: detail :: Transfer_all_t, boost :: _ bi :: bind_t (*) ()>

)'
....
.......

полный исходный код: http://liveworkspace.org/code/eca749f6f2714b7c3c4df9f26a404d86

Ответы [ 3 ]

10 голосов
/ 01 ноября 2010

Мне кажется, проблема в том, что вы передаете константный буфер в async_read вместо изменяемого буфера.В блоке, заканчивающемся строкой 50, boost::asio::buffer(_header) возвращает постоянный буфер.Вы должны сделать что-то вроде boost::asio::async_read(s, boost::asio::buffer(data, size), handler), потому что boost::asio::buffer(data, size) создает изменяемый буфер.

Вместо использования std::string s для _header и _data, вам, вероятно, нужно использовать массивы char, такие как:

char * _data;
boost :: asio :: buffer (_data, strlen (_data));

См. Ссылки на буфер и async_read.

4 голосов
/ 21 мая 2016

Вы должны передать указатель в качестве первого параметра:

#include <string>
#include <boost/asio.hpp>

std::string request, reply;
auto rsize = boost::asio::buffer(&reply[0], request.size());
3 голосов
/ 05 июля 2012

http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/buffer.html

Кажется, что std :: string может быть передан только в asio :: buffer как константная ссылка.

std :: vector должна быть лучшей альтернативой

std::vector<char> d2(128);
bytes_transferred = sock.receive(boost::asio::buffer(d2));
...