2010-09-22 3 views
1

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

Как это сделать с помощью async_read?

ответ

5

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

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

+0

+1 для использования богатства API лучше, чем мое предложение –

1

Вы можете гарантировать, что заголовок можно использовать, используя transfer_at_least как CompletionCondition on async_read.

Любые лишние данные тела (или дополнительные заголовки) могут обрабатываться после обработки начального заголовка.

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

является то, что вы need.just попробуйте использовать так:

boost::asio::async_read(socket_, 
         buf,boost::asio::transfer_exactly(size_), 
         boost::bind(callback, 
         boost::asio::placeholders::error)); 
Смежные вопросы