Dynamically sized boost::asio::buffer
I'm reading from a boost::asio::ip::udp::socket
like this:
using boost::asio::ip::udp;
// ...
char recv_buf[128];
udp::endpoint sender_endpoint;
size_t len = socket.recei开发者_运维知识库ve_from(boost::asio::buffer(recv_buf), sender_endpoint);
Now, this works perfectly fine, but the maximum amount of characters that I am able to recieve is now 127. However I am facing a problem because I need to accept some data input of which the length can greatly vary (and is not of well-defined length with prefixed headers, for example). A solution to this would be a dynamically expanding buffer, like a vector. Is it possible to create a dynamically expanding boost::asio::buffer
to accept (theoretical) infite amounts of input and store it in a container?
UDP datagram size does not vary all that greatly: it will never be greater than 65535, leaving room for 65,527 bytes of data after the 8-byte header.
Boost 1.66.0 added dynamic_buffer
which can adapt a reference to std::string
or std::vector<CharType>
:
- http://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/dynamic_buffer.html
If you use smaller buffers, you can easily chain them together via the *BufferSequences concepts. For example, you can pass in a MutableBufferSequence to accept data from a read(2) call or pass a ConstBufferSequence for a list of buffers that you are going to write(2) out. That said, I tend to recommend using a single buffer in each direction because it tends to simplify code (though that's not always possible).
There does not appear to be any provision for dynamic sizing. And it makes sense that there would not be. Think about what would have to happen:
- A single UDP datagram can only be received once, and at once, therefore:
- the buffer given to the low-level system call needs to be large enough for the largest valid message, so,
- for it to be efficient, the buffer must be allocated up-front by the caller.
So it does not make sense for there to be a dynamically-sized buffer available. As Cubbi points out, UDP datagrams have a smallish maximum size anyway, so just make your buffer as large as the largest valid message in your system and be done with it.
精彩评论