【问题标题】:boost::asio udp - How do I get many mutable buffers filled?boost::asio udp - 如何填充许多可变缓冲区?
【发布时间】:2013-03-10 13:21:16
【问题描述】:

我正在尝试从一个 async_receive 调用接收许多 udp 消息。我的信息大约是。 60 字节长。

我正在给async_receive 调用一个缓冲区数组,该数组与 boost 文档非常相似,但似乎无法填满所有缓冲区。

char d1[128];
char d2[128];
char d3[128];

boost::array<boost::asio::mutable_buffer, 3> bufs = 
{
   boost::asio::buffer(d1),
   boost::asio::buffer(d2),
   boost::asio::buffer(d3) 
};

_socket.async_receive(bufs, handler);

当我的处理程序被调用时,bytes_transferred 等于一个消息长度(即 60)。

关于如何填充第二个和第三个缓冲区有什么想法吗?另外,如果填充了第二个和第三个可变缓冲区,我现在该怎么办?

【问题讨论】:

  • 贴一些我们可以编译的代码,你的伪代码描述的不够准确。
  • 如果您需要填充多个缓冲区,则必须多次调用 async_receive()。每次调用 async_receive() 都会收到一个 UDP 数据报(不,您不能连续调用两次 async_receive())。另一个故事是,例如将消息的标题和正文接收到两个缓冲区中。

标签: c++ boost boost-asio


【解决方案1】:

如果你想在一个调用中接收多个数据报,你通常(不管 Boost)需要使用recvmmsg。据我所知,Boost 不使用 recvmmsg,因此您需要自己使用它与 Boost ASIO 持有的本机套接字。这样做的好处是可以在多个数据报可用时减少系统调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多