2010-07-23 52 views
1

我试图从一个async_receive调用接收许多udp消息。我的信息是约。长度为60个字节。boost :: asio udp - 如何获得很多可变缓冲区?

我给一个async_receive调用一个缓冲阵列非常相似的提升文档,但似乎无法得到全部填满缓冲区。

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)。

我如何能获得第二和第三缓冲任何想法填充?另外,如果第二个和第三个可变缓冲区被填充,我现在该如何?

+0

发布了一些我们可以编译的代码,你的伪代码并不足够准确地描述问题。 – 2010-07-26 19:45:13

+0

如果您需要填充多个缓冲区,则必须对async_receive()进行多次调用。每次调用async_receive()都会收到一个UDP数据报(并且不行,您不应该在连续两次调用async_receive())。另一个故事是,例如将消息的头部和正文接收到两个缓冲区中。 – 2011-03-14 15:51:14

回答

1

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