当我尝试将std :: string与boost :: asio :: buffer一起使用时,我收到以下错误消息:
升压/ ASIO /细节/ consuming_buffers.hpp: 在构造函数中 “提高:: ASIO ::详细:: consuming_buffers< boost :: asio :: mutable_buffer,boost :: asio :: const_buffers_1
:: consume_buffers(const boost :: asio :: const_buffers_1&)': 提升/ ASIO / IMPL / 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
答案 0 :(得分:10)
我认为问题在于您将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)
会创建一个可变缓冲区。
您可能需要使用char数组,而不是将std::string
用于_header和_data,例如:
char * _data;
boost :: asio :: buffer(_data,strlen(_data));
请参阅buffer和async_read的参考资料。
答案 1 :(得分:4)
您必须将指针作为第一个参数传递:
#include <string>
#include <boost/asio.hpp>
std::string request, reply;
auto rsize = boost::asio::buffer(&reply[0], request.size());
答案 2 :(得分:3)
http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/buffer.html
似乎std :: string只能作为const引用传递给asio :: buffer。
std :: vector应该是更好的选择:
std::vector<char> d2(128);
bytes_transferred = sock.receive(boost::asio::buffer(d2));