使用asio null_buffers增强asio udp套接字

时间:2018-04-10 10:01:05

标签: c++ boost udp boost-asio

我想使用Boost ASIO库异步接收来自UDP套接字的数据。我不想在使用async_receive_from接收数据时使用固定长度的缓冲区。

以下代码是我如何使用boost asio :: null_buffers来确定传入的数据包大小并相应地创建缓冲区。

socket.async_receive_from(boost::asio::null_buffers(),
                           remote_endpoint,
                           [&](boost::system::error_code ec, std::size_t bytes) {
  unsigned int readbytes = socket.available();
  if (readbytes > buffer_size) {
    //reallocate buffer
  }
  std::size_t recvbytes = socket.receive_from(
      boost::asio::buffer(buffer, buffer_size), remote_endpoint, 0, error);

一切都按预期工作,但是,我想知道boost null_buffer是否分配一个内部缓冲区来保存收到的UDP数据包的副本,并在调用socket.receive_from()时复制到给定的缓冲区。

另外,我想知道在使用UDP套接字时使用null_buffer对性能和内存使用率有什么影响。

2 个答案:

答案 0 :(得分:4)

RichardHodges说的话。

此外,Boost 1.66.0有the new interface,其中null_buffers已过时,反应堆式集成可以使用套接字上的async_wait操作完成:

enter image description here

参见例如这里的文档https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/basic_socket/wait/overload1.html

答案 1 :(得分:2)

null_buffers不是缓冲区。它是一个用于选择接收/读/写函数的不同(和特殊)重载的类型的值。

这些重载只是测试套接字的状态,以告诉你是否有要读取的数据(以及有多少)。

你的方法很好而且效率很高。