Запустите асинхронную операцию для считывания данных в streambuf до тех пор, пока он не будет содержать определенный разграничитель.
template<
typename AsyncReadStream,
typename Allocator,
typename ReadHandler>
void-or-deduced async_read_until(
AsyncReadStream & s,
boost::asio::basic_streambuf< Allocator > & b,
const std::string & delim,
ReadHandler handler);
Эта функция используется для асинхронного считывания данных в указанный streambuf до тех пор, пока область получения streambuf не содержит указанный делимитер. Звонок функции всегда возвращается немедленно. Асинхронная операция будет продолжаться до тех пор, пока не будет выполнено одно из следующих условий:
- Зона получения Streambuf содержит указанный делимитер.
- Произошла ошибка.
Эта операция реализована в терминах нуля или более вызовов функции async_read_some потока и известна каксоставленная операция. Если зона получения Streambuf уже содержит разграничитель, эта асинхронная операция завершается немедленно. Программа должна гарантировать, что поток не выполняет никаких других операций чтения (таких как async_read, async_read_until, функция async_read_some потока или любые другие составные операции, которые выполняют чтения) до завершения этой операции.
- s
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию AsyncReadStream.
- b
Объект streambuf, в который будут считываться данные. Владение Streambuf сохраняется за абонентом, который должен гарантировать, что он остается действительным до тех пор, пока не будет вызван обработчик.
- delim
Струна разграничителя.
- 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.
Чтобы асинхронно считывать данные в streambuf до появления новой линии:
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, "\r\n", handler);
После успешного завершения операции<async_read_until
>буфер<b
>содержит разграничитель:
{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }
Призыв к<std::getline
>затем извлекает данные до и включая делимитер, так что строка<line
>содержит:
{ 'a', 'b', ..., 'c', '\r', '\n' }
Остальные данные оставляют в буфере<b
>следующим образом:
{ 'd', 'e', ... }
Эти данные могут быть началом новой линии, которая будет извлечена последующей операцией<async_read_until
>.