Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码标准

PrevUpHomeNext

async_read_until(12 个重载中的 1 个)

启动一个异步操作,将数据读取到动态缓冲区序列中,直到它包含指定的定界符。

template<
    typename AsyncReadStream,
    typename DynamicBuffer_v1,
    typename ReadToken = default_completion_token_t<        typename AsyncReadStream::executor_type>>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer_v1 && buffers,
    char delim,
    ReadToken && token = default_completion_token_t< typename AsyncReadStream::executor_type >(),
    constraint_t< is_dynamic_buffer_v1< decay_t< DynamicBuffer_v1 > >::value >  = 0,
    constraint_t< !is_dynamic_buffer_v2< decay_t< DynamicBuffer_v1 > >::value >  = 0);

此函数用于异步地将数据读取到指定的动态缓冲区序列中,直到动态缓冲区序列的读取区域包含指定的定界符。它是异步操作的启动函数,并始终立即返回。异步操作将继续,直到以下条件之一为真:

此操作通过零次或多次调用流的 async_read_some 函数来实现,被称为组合操作。如果动态缓冲区序列的读取区域已包含定界符,则此异步操作会立即完成。程序必须确保在操作完成之前,流不执行其他读取操作(例如 async_read、async_read_until、流的 async_read_some 函数或任何其他执行读取的组合操作)。

参数

s

要从中读取数据的流。该类型必须支持 AsyncReadStream 概念。

buffers

数据将要读取到的动态缓冲区序列。虽然可以根据需要复制 buffers 对象,但底层内存块的所有权由调用者保留,调用者必须保证它们在完成处理程序被调用之前保持有效。

delim

定界符字符。

token

完成令牌,将用于生成完成处理程序,该处理程序将在读取完成时被调用。潜在的完成令牌包括 use_futureuse_awaitableyield_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 中,直到遇到换行符

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, '\n', handler);

async_read_until 操作成功完成后,缓冲区 data 包含定界符

{ 'a', 'b', ..., 'c', '\n', 'd', 'e', ... }

然后调用 substr 提取直到并包括定界符的数据,以便字符串 line 包含

{ 'a', 'b', ..., 'c', '\n' }

在调用 erase 之后,剩余数据保留在缓冲区 data 中,如下所示

{ 'd', 'e', ... }

此数据可能是新行的开始,将由后续的 async_read_until 操作提取。

每个操作的取消

此异步操作支持以下 cancellation_type 值的取消:

如果 AsyncReadStream 类型的 async_read_some 操作也支持它们。


PrevUpHomeNext