启动一个异步操作,将数据读取到动态缓冲区序列中,直到它包含指定的定界符。
template< typename AsyncReadStream, typename DynamicBuffer_v2, typename ReadToken = default_completion_token_t< typename AsyncReadStream::executor_type>> DEDUCED async_read_until( AsyncReadStream & s, DynamicBuffer_v2 buffers, string_view delim, ReadToken && token = default_completion_token_t< typename AsyncReadStream::executor_type >(), constraint_t< is_dynamic_buffer_v2< DynamicBuffer_v2 >::value > = 0);
此函数用于异步地将数据读取到指定的动态缓冲区序列中,直到动态缓冲区序列的获取区域包含指定的定界符。 它是 异步操作 的启动函数,并始终立即返回。 异步操作将继续,直到以下条件之一为真
此操作通过零次或多次调用流的 async_read_some 函数来实现,被称为 组合操作。 如果动态缓冲区序列的获取区域已经包含定界符,则此异步操作立即完成。 程序必须确保流在操作完成之前不执行其他读取操作(例如 async_read、async_read_until、流的 async_read_some 函数或任何其他执行读取的组合操作)。
从中读取数据的流。 类型必须支持 AsyncReadStream 概念。
数据将读取到其中的动态缓冲区序列。 尽管可以根据需要复制 buffers 对象,但底层内存块的所有权由调用者保留,调用者必须保证它们在完成处理程序被调用之前保持有效。
定界符字符串。
将用于生成完成处理程序的 完成令牌,将在读取完成时调用该处理程序。 潜在的完成令牌包括 use_future
、 use_awaitable
、 yield_context
或具有正确完成签名的函数对象。 完成处理程序的函数签名必须是
void handler( // Result of operation. const boost::system::error_code& error, // The number of bytes in the dynamic buffer sequence's // get area up to and including the delimiter. std::size_t bytes_transferred );
无论异步操作是否立即完成,完成处理程序都不会在此函数内部调用。 在立即完成时,处理程序的调用将以类似于使用 async_immediate
的方式执行。
void(boost::system::error_code, std::size_t)
在成功的 async_read_until 操作之后,动态缓冲区序列可能包含超出定界符的额外数据。 应用程序通常会将该数据留在动态缓冲区序列中,以便后续的 async_read_until 操作进行检查。
异步地将数据读取到 std::string
中,直到遇到 CR-LF 序列
std::string data; ... void handler(const boost::system::error_code& e, std::size_t size) { if (!e) { std::string line = data.substr(0, n); data.erase(0, n); ... } } ... boost::asio::async_read_until(s, data, "\r\n", handler);
在 async_read_until
操作成功完成后,字符串 data
包含定界符
{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }
然后调用 substr
提取直到并包括定界符的数据,以便字符串 line
包含
{ 'a', 'b', ..., 'c', '\r', '\n' }
在调用 erase
之后,剩余数据保留在字符串 data
中,如下所示
{ 'd', 'e', ... }
此数据可能是新行的开始,将由后续的 async_read_until
操作提取。
此异步操作支持以下 cancellation_type
值的取消
cancellation_type::terminal
cancellation_type::partial
如果 AsyncReadStream
类型的 async_read_some
操作也支持它们。