1
votes

I am using async_read with streambuf. However, I would like to limit the amount of data read to 4, so I can properly handle header before going to body.

How can I do that using async_read?

3

3 Answers

5
votes

Use two async_read operations where the first reads a 4 byte header, and the second reads the message body. Your handler to the first async_read should start the async_read for the message body.

The asio examples use this technique in a couple of places, the serialization example is one. I also answered a similar question, though it uses synchronous reads, but the concept is the same.

1
votes

You can guarantee the header is available using transfer_at_least as CompletionCondition on async_read.

Any superfluous body data (or further headers) can be processed once you handle the initial header.

0
votes
boost::asio::transfer_exactly(streambuf.size()) 

is what you need.just try using like this:

boost::asio::async_read(socket_, 
                        buf,boost::asio::transfer_exactly(size_),
                        boost::bind(callback,
                        boost::asio::placeholders::error));