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

asio::buffer type for sending both std::vector and std::string

本文关键字:std vector string 用于 buffer 类型 asio      更新时间:2023-10-16

我想找到一个 asio::buffer 类型/构造函数,我可以用来通过 asynch_send_to 发送std::stringstd::vector对象。

请注意,我使用的是独立的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"的成员
  • 'begin':
  • 不是'asio::const_buffer'的成员
  • 'end':
  • 不是 'asio::const_buffer' 的成员
  • "iter":未声明的标识符

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

谢谢!

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

 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. 不要复制数据/缓冲区(不允许数据在范围退出时被释放()'d/删除,就像你的第一个代码段一样)