Запустите асинхронную операцию для считывания данных в streambuf, пока объект функции не покажет соответствие.
template<
    typename AsyncReadStream,
    typename Allocator,
    typename MatchCondition,
    typename ReadHandler>
void-or-deduced async_read_until(
    AsyncReadStream & s,
    boost::asio::basic_streambuf< Allocator > & b,
    MatchCondition match_condition,
    ReadHandler handler,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
Эта функция используется для асинхронного считывания данных в заданный Streambuf до тех пор, пока определяемый пользователем объект функции состояния соответствия, при применении к данным, содержащимся в Streambuf, не указывает на успешное соответствие. Звонок функции всегда возвращается немедленно. Асинхронная операция будет продолжаться до тех пор, пока не будет выполнено одно из следующих условий:
- Объект функции соответствия возвращает std::pair, где второй элемент оценивает истинность.
 
- Произошла ошибка.
 
 
Эта операция реализована в терминах нуля или более вызовов функции async_read_some потока и известна каксоставленная операция. Если объект функции соответствия уже указывает на соответствие, эта асинхронная операция завершается немедленно. Программа должна гарантировать, что поток не выполняет никаких других операций чтения (таких как async_read, async_read_until, функция async_read_some потока или любые другие составные операции, которые выполняют чтения) до завершения этой операции.
- s
 
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию AsyncReadStream.
 
- b
 
Объект streambuf, в который будут считываться данные.
 
- match_condition
 
- 
Объект функции должен быть вызван, чтобы определить, существует ли совпадение. Подпись объекта функции должна быть:
pair<iterator, bool> match_condition(iterator begin, iterator end);
где<iterator>обозначает тип:
buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>
Параметры итератора<begin>и<end>определяют диапазон байтов для сканирования, чтобы определить, есть ли совпадение.<first>членом возвратного значения является итератор, обозначающий один конец байтов, которые были потреблены функцией соответствия. Этот итератор используется для расчета параметра<begin>для любого последующего вызова состояния соответствия.<second>элемент обратной стоимости является истинным, если совпадение было найдено, ложным в противном случае.
 
- handler
 
- 
Обработчик должен быть вызван, когда операция чтения завершится. Копии будут сделаны из обработчика по мере необходимости. Функциональная подпись обработчика должна быть:
void handler(
  
  const boost::system::error_code& error,
  
  
  
  std::size_t bytes_transferred
);
Независимо от того, выполняется ли асинхронная операция немедленно или нет, обработчик не будет вызываться из этой функции. Привлечение обработчика будет выполнено способом, эквивалентным использованию<boost::asio::io_service::post()>.
 
 
После успешной работы async_read_until, streambuf может содержать дополнительные данные, которые не соответствуют объекту функции. Приложение обычно оставляет эти данные в streambuf для последующей работы async_read_until.
Реализация по умолчанию признака<is_match_condition>типа оценивает истинность для указателей функций и объектов функций с<result_type>типизированным значением. Он должен быть специализирован для других определяемых пользователем функциональных объектов.
Чтобы асинхронно считывать данные в streambuf, пока не встретится белое пространство:
typedef boost::asio::buffers_iterator<
    boost::asio::streambuf::const_buffers_type> iterator;
std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}
...
void handler(const boost::system::error_code& e, std::size_t size);
...
boost::asio::streambuf b;
boost::asio::async_read_until(s, b, match_whitespace, handler);
Для асинхронного чтения данных в streambuf до тех пор, пока не будет найден соответствующий символ:
class match_char
{
public:
  explicit match_char(char c) : c_(c) {}
  template <typename Iterator>
  std::pair<Iterator, bool> operator()(
      Iterator begin, Iterator end) const
  {
    Iterator i = begin;
    while (i != end)
      if (c_ == *i++)
        return std::make_pair(i, true);
    return std::make_pair(i, false);
  }
private:
  char c_;
};
namespace asio {
  template <> struct is_match_condition<match_char>
    : public boost::true_type {};
} 
...
void handler(const boost::system::error_code& e, std::size_t size);
...
boost::asio::streambuf b;
boost::asio::async_read_until(s, b, match_char('a'), handler);