Как использовать 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));