【发布时间】:2013-12-06 08:53:29
【问题描述】:
我有一个 UDP 套接字,它将接收一些可能不同大小的数据包,我异步处理:
socket.async_receive_from(boost::asio::buffer(buffer, 65536), senderEndpoint, handler);
这里的问题是,为了处理不同的大小,我有一个很大的缓冲区,这可以通过可变大小的缓冲区来解决。
据我了解,在使用async_receive_from 时,一次只使用一个数据包调用处理程序,因为数据包边界保留在 UDP 中。那么,有没有办法为async_receive_from 提供一个空缓冲区,以便 Asio 可以增长以适应数据包大小?
还请注意,我包装了数据包,因此对于传输到此套接字的每个数据包,前 4 个字节是数据包的长度。
【问题讨论】:
-
为什么?只需指定您需要的最大缓冲区。 receive 方法会告诉你实际收到了多少字节。
-
这个程序将在移动平台上运行,而不是在电脑上运行——所以它的内存占用应该是轻量级的。我认为有比分配大缓冲区更有效的方法。
-
一次分配一个大缓冲区比分配许多较小的缓冲区要有效得多。
-
您可以通过
null_buffers懒惰地分配适当大小的缓冲区。此外,包含长度的前 4 个字节可能是不必要的,因为available()返回可供读取的数据报的大小,而receive()将出列最多一个数据报。
标签: c++ boost udp buffer boost-asio