boost - 如何在 asio::buffer() 中使用 std::string

标签 boost buffer boost-asio

当我尝试将 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/

相关文章:

C++ Boost SML 库

c++ - boost::any 析构函数崩溃

emacs - 如何让 emacs 快速打开新缓冲区?

c++ - boost::asio,为什么我的套接字在调用 async_receive_from 后立即运行回调函数?

c++ - 如何在更多线程上运行 boost asio 解析器服务?

c++ - 如何将 back_inserter 与转换结合起来,C++

c++ - 如何通过 boost::asio 和 shared_ptr 创建串口

c# - C#中读取套接字时算术运算溢出

arrays - Node.js:创建 8 字节缓冲区

c++11 - Boost asio thread_pool join 不等待任务完成