asio :: buffer类型,用于发送std :: vector和std :: string

时间:2016-03-15 03:55:43

标签: c++ string vector boost-asio

我希望找到一个asio :: buffer类型/构造函数,我可以通过std::string发送std::vectorasynch_send_to个对象。

请注意我使用独立 asio,没有提升!

现在,我用来发送数据的功能是:

 void UdpSocket::send_datagram(asio::const_buffer buffer) {
    mSocket.async_send_to(buffer, mEndpoint,
        [this, datagram](const asio::error_code& error, std::size_t bytes_transferred) {
        if (!error) {
            // stuff...
        }
        else{ 
            // other stuff..
        }
    });
  }

我希望能够使用:

  std::vector mVector;
  send_datagram(asio::buffer(mVector.data(), mVector.size());

  std::string mString = "hello world";
  send_datagram(asio::buffer(mString.data(), mString.length());

上面给出了buffer_sequence_adapter.hpp中的一系列错误:

  • ' const_iterator':不是' asio :: const_buffer'
  • 的成员
  • '开始':不是' asio :: const_buffer'
  • 的成员
  • ' end':不是' asio :: const_buffer'
  • 的成员
  • ' iter':未声明的标识符

我对缓冲区的数量和它们之间的兼容性有点不知所措;有人可以帮我理清哪种类型的缓冲区/构造函数可以使用std::vectorstd::string类型?

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以接受缓冲区指针&作为参数的长度,这可能是最可扩展的方式:

 void UdpSocket::send_datagram(const char *buf, size_t len) {
    mSocket.async_send_to(asio::buffer(buf, len), mEndpoint,
        [this, datagram](const asio::error_code& error, std::size_t bytes_transferred) {

这使您几乎可以使用任何存储,为方便起见,您可以编写如下的简单重载:

void send_datagram(const std::string &s) { send_datagram(s.c_str(), s.size()); }
void send_datagram(const std::vector<char> &s) { send_datagram(s.data(), s.size()); }

但是在这个片段中你应该记住一些事情:

  1. 您应该保持源缓冲区处于活动状态,直到异步操作完成。
  2. 不要复制数据/缓冲区(不要像在第1个代码段中那样在范围退出时允许数据空闲()删除/删除)