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

niX*_*man 13 buffer boost boost-asio

当我尝试使用带有boost :: asio :: buffer的std :: string时,我收到以下错误消息:

boost/asio/detail/consume_buffers.hpp:在构造函数'boost :: asio :: detail :: consume_buffers <boost :: asio :: mutable_buffer,boost :: asio :: const_buffers_1

:: consume_buffers(const boost :: asio :: const_buffers_1&)':boost/asio/impl/read.hpp:140:25:
从'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>(*)()>

)'
....
.......
Run Code Online (Sandbox Code Playgroud)

完整源代码:http://liveworkspace.org/code/eca749f6f2714b7c3c4df9f26a404d86

rtu*_*ado 11

我认为问题是你传递一个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)创建一个可变的缓冲区.

而不是将std::strings用于_header和_data,您可能需要使用char数组,例如:

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

请参阅buffer和async_read的参考.

  • 我很确定std :: strings可以分配给char*数组,并且可以使用std :: string.c_str()从std :: string导出char*数组 (2认同)
  • `std::string::c_str()` 返回 `const char*` 而不是 `char*`。它只能与 `const_buffer` 一起使用。 (2认同)

Gan*_*Yin 6

boost::asio::buffer参考文档

似乎std::string只能asio::buffer作为常量引用传递给 an 。

std::vector<char> 应该是更好的选择:

std::vector<char> d2(128);
bytes_transferred = sock.receive(boost::asio::buffer(d2));
Run Code Online (Sandbox Code Playgroud)


xun*_*ang 5

您必须传递一个指针作为第一个参数:

#include <string>
#include <boost/asio.hpp>

std::string request, reply;
auto rsize = boost::asio::buffer(&reply[0], request.size());
Run Code Online (Sandbox Code Playgroud)

  • 注意,在C ++ 11之前,这不一定是正确的。在C ++ 11之前的版本中,不能保证std :: string持有的char数组是连续的,这是boost :: asio :: buffer所必需的。实际上,每个编译器都使用连续的内存块,因此这在C ++ 11中成为必需的行为。 (2认同)