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

时间:2010-11-01 10:55:54

标签: boost buffer boost-asio

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

3 个答案:

答案 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));