Как использовать std::string с asio:: buffer()

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

повышение/ASIO/подробно/consuming_buffers.hpp: В конструкторе "Повышение:: ASIO:: подробнее:: consuming_buffers <         boost:: asio:: mutable_buffer, boost:: asio:: const_buffers_1

:: consuming_buffers (const boost:: asio:: const_buffers_1 &) ':   повышение/ASIO/осущ/read.hpp: 140: 25:
  созданный из   " Повышение:: ASIO:: подробнее:: read_op <           повышение:: ASIO:: basic_stream_socket,   повышение:: ASIO:: const_buffers_1         , boost:: asio:: detail:: transfer_all_t         , boost:: _ bi:: bind_t <               void, boost:: _ mfi:: mf1             , boost:: _ bi:: list2, boost:: arg < 1 > (*)() >

     

:: read_op (           повышение:: ASIO:: basic_stream_socket   &, const boost:: asio:: const_buffers_1   & Амп;         , boost:: asio:: detail:: transfer_all_t         , boost:: _ bi:: bind_t <               void, boost:: _ mfi:: mf1             , boost:: _ bi:: list2, boost:: arg < 1 > (*)() >

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

std::string request, reply;
auto rsize = boost::asio::buffer(&reply[0], request.size());

Ответ 3

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));