boost::asio::async_read и boost::asio::streambuf

Я использую async_read с streambuf. Тем не менее, я хотел бы ограничить количество считываемых данных до 4, чтобы я мог правильно обработать заголовок перед переходом к телу.

Как я могу сделать это, используя async_read?

3 ответа

Использовать два async_read операции, где первая читает 4-байтовый заголовок, а вторая читает тело сообщения. Ваш обработчик первым async_read должен начать async_read для тела сообщения.

Примеры asio используют эту технику в нескольких местах, пример сериализации один. Я также ответил на аналогичный вопрос, хотя он использует синхронное чтение, но концепция та же.

Вы можете гарантировать доступность заголовка, используя 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));
Другие вопросы по тегам