boost :: asio :: async_read и boost :: asio :: streambuf - PullRequest
1 голос
/ 22 сентября 2010

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

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

Ответы [ 3 ]

5 голосов
/ 22 сентября 2010

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

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

1 голос
/ 22 сентября 2010

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

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

0 голосов
/ 25 июля 2014
boost::asio::transfer_exactly(streambuf.size()) 

- это то, что вам нужно. Попробуйте использовать вот так:

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