代码之家  ›  专栏  ›  技术社区  ›  niXman

如何将std::string与asio::buffer()一起使用

  •  12
  • niXman  · 技术社区  · 14 年前

    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

    3 回复  |  直到 5 年前
        1
  •  11
  •   Joel Bodenmann Bob Bryan    5 年前

    我想问题是你正在把一个常量缓冲区传递给 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 对于头和数据,可能需要使用char数组,例如:

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

    参见参考文件 buffer .

        2
  •  5
  •   xunzhang    9 年前

    #include <string>
    #include <boost/asio.hpp>
    
    std::string request, reply;
    auto rsize = boost::asio::buffer(&reply[0], request.size());
    
        3
  •  5
  •   Joel Bodenmann Bob Bryan    5 年前

    boost::asio::buffer reference documentation :

    看来 std::string asio::buffer 作为常量引用。

    std::vector<char>

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