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

家住魔仙堡 提交于 2019-11-30 01:37:36

问题


I get the following error message when I'm trying to use std::string with boost::asio::buffer:

boost/asio/detail/consuming_buffers.hpp: In constructor 'boost::asio::detail::consuming_buffers< boost::asio::mutable_buffer, boost::asio::const_buffers_1

::consuming_buffers(const boost::asio::const_buffers_1 &)': boost/asio/impl/read.hpp:140:25:
instantiated from 'boost::asio::detail::read_op< boost::asio::basic_stream_socket, 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> (*)()>

::read_op( boost::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> (*)()>

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

full source code: http://liveworkspace.org/code/eca749f6f2714b7c3c4df9f26a404d86


回答1:


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 references for buffer and async_read.




回答2:


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



回答3:


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

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

std::vector should be a better alternative:

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


来源:https://stackoverflow.com/questions/4068249/how-to-use-stdstring-with-asiobuffer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!