Reputation: 117641
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.receive_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?
Upvotes: 11
Views: 7655
Reputation: 392833
Boost 1.66.0 added dynamic_buffer
which can adapt a reference to std::string
or std::vector<CharType>
:
Upvotes: 3
Reputation: 47408
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.
Upvotes: 5
Reputation: 10206
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).
Upvotes: 1
Reputation: 249103
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:
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.
Upvotes: 0