Я использую async_read с streambuf.Однако я хотел бы ограничить количество считываемых данных до 4, чтобы я мог правильно обработать заголовок перед переходом к телу.
Как я могу это сделать с помощью async_read?
Используйте две операции async_read, где первая читает 4-байтовый заголовок, а вторая читает тело сообщения. Ваш обработчик первого async_read должен запустить async_read для тела сообщения.
async_read
Примеры asio используют эту технику в нескольких местах, пример serialization один. Я также ответил на аналогичный вопрос , хотя он использует синхронное чтение, но концепция та же.
Вы можете гарантировать доступность заголовка, используя Transfer_at_least как CompletionCondition для async_read .
Любые лишние данные тела (или дополнительные заголовки) могут быть обработаны после обработки исходного заголовка.
boost::asio::transfer_exactly(streambuf.size())
- это то, что вам нужно. Попробуйте использовать вот так:
boost::asio::async_read(socket_, buf,boost::asio::transfer_exactly(size_), boost::bind(callback, boost::asio::placeholders::error));