当我尝试将 std::string 与 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::ip::tcp>,
boost::asio::const_buffers_1
, boost::asio::detail::transfer_all_t
, boost::_bi::bind_t<
void, boost::_mfi::mf1<void, read_op, const
boost::system::error_code &>
, boost::_bi::list2<boost::_bi::value<read_op
*>, boost::arg<1> (*)()>
>
>::read_op(
boost::asio::basic_stream_socket<boost::asio::ip::tcp>
&, const boost::asio::const_buffers_1
&
, boost::asio::detail::transfer_all_t
, boost::_bi::bind_t<
void, boost::_mfi::mf1<void, read_op, const
boost::system::error_code &>
, boost::_bi::list2<boost::_bi::value<read_op
*>, boost::arg<1> (*)()>
>
)'
[...]
完整源代码:http://liveworkspace.org/code/eca749f6f2714b7c3c4df9f26a404d86
最佳答案
我认为问题在于您将常量缓冲区传递给 async_read
而不是可变缓冲区。在第 50 行结束的块中,boost::asio::buffer(_header)
返回一个常量缓冲区。你应该做类似 boost::asio::async_read(s, boost::asio::buffer(data, size), handler)
的事情, 因为 boost::asio::buffer(data, size)
创建一个可变缓冲区。
而不是使用 std::string
对于 _header 和 _data,您可能需要使用字符数组,例如:
char* _data;
boost::asio::buffer(_data, strlen(_data));
请参阅
buffer
的引用文档和 async_read
.
关于boost - 如何在 asio::buffer() 中使用 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4068249/