How to use std::string with asio::buffer()

I think the problem is that you are passing a const buffer to async_read instead of a mutable buffer. In the block ending in line 50, boost::asio::buffer(_header) returns a const buffer. You should do something like boost::asio::async_read(s, boost::asio::buffer(data, size), handler), because boost::asio::buffer(data, size) creates a mutable buffer.

Instead of using std::strings for _header and _data, you probably need to use arrays of char, such as:

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

See reference documentations for buffer and async_read.


From the boost::asio::buffer reference documentation:

It seems that std::string could only be passed into an asio::buffer as a const reference.

std::vector<char> should be a better alternative:

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

You must pass a pointer as the first parameter:

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

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