Начните асинхронную операцию по считыванию данных в streambuf до тех пор, пока некоторая часть его данных не совпадет с обычным выражением.
template<
typename AsyncReadStream,
typename Allocator,
typename ReadHandler>
void-or-deduced async_read_until(
AsyncReadStream & s,
boost::asio::basic_streambuf< Allocator > & b,
const boost::regex & expr,
ReadHandler handler);
Эта функция используется для асинхронного считывания данных в заданный streambuf до тех пор, пока область получения streambuf не содержит некоторые данные, которые соответствуют обычному выражению. Звонок функции всегда возвращается немедленно. Асинхронная операция будет продолжаться до тех пор, пока не будет выполнено одно из следующих условий:
- Подстрочник зоны получения стримбуфа соответствует обычному выражению.
- Произошла ошибка.
Эта операция реализована в терминах нуля или более вызовов функции async_read_some потока и известна каксоставленная операция. Если область получения Streambuf уже содержит данные, соответствующие обычному выражению, эта асинхронная операция завершается немедленно. Программа должна гарантировать, что поток не выполняет никаких других операций чтения (таких как async_read, async_read_until, функция async_read_some потока или любые другие составные операции, которые выполняют чтения) до завершения этой операции.
- s
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию AsyncReadStream.
- b
Объект streambuf, в который будут считываться данные. Владение Streambuf сохраняется за абонентом, который должен гарантировать, что он остается действительным до тех пор, пока не будет вызван обработчик.
- expr
Регулярное выражение.
- handler
-
Обработчик должен быть вызван, когда операция чтения завершится. Копии будут сделаны из обработчика по мере необходимости. Функциональная подпись обработчика должна быть:
void handler(
const boost::system::error_code& error,
std::size_t bytes_transferred
);
Независимо от того, выполняется ли асинхронная операция немедленно или нет, обработчик не будет вызываться из этой функции. Обращение к обработчику будет выполнено способом, эквивалентным использованиюнаддува:асио:io_service::пост()
.
После успешной работы async_read_until, streambuf может содержать дополнительные данные, не соответствующие обычному выражению. Приложение обычно оставляет эти данные в streambuf для последующей работы async_read_until.
Чтобы асинхронно считывать данные в streambuf, пока не встретится последовательность CR-LF:
boost::asio::streambuf b;
...
void handler(const boost::system::error_code& e, std::size_t size)
{
if (!e)
{
std::istream is(&b);
std::string line;
std::getline(is, line);
...
}
}
...
boost::asio::async_read_until(s, b, boost::regex("\r\n"), handler);
Послеasync_read_until
операция завершается успешно, буферb
содержит данные, которые соответствовали обычному выражению:
{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }
Призыв кст.:getline
затем извлекает данные до и включая совпадение, так что строкастрока
содержит:
{ 'a', 'b', ..., 'c', '\r', '\n' }
Остальные данные оставляют в буфереb
следующим образом:
{ 'd', 'e', ... }
Эти данные могут быть началом новой строки, которая будет извлечена последующимasync_read_until
.