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));