[关闭]
@john-lee 2021-01-01T17:00:41.000000Z 字数 1729 阅读 864

基本 Boost.Asio 结构(Basic Boost.Asio Anatomy)

Boost.Asio


Boost.Asio 可用于对 I/O 对象(如套接字)执行同步和异步操作。在使用 Boost.Asio 之前,获取 Boost.Asio 的各个部分的概念图,以及它们如何协同工作可能很有用。

作为介绍性示例,让我们考虑在套接字上执行连接操作时会发生什么。我们将从检查同步操作开始。

sync_op

你的程序(Your Program)将至少有一个I/O 执行上下文(I/O execution context),如boost::asio::io_context对象、boost::asio::thread_pool对象或boost::asio::system_context。此I/O执行上下文表示你的程序链接到了操作系统(Operating system)的 I/O服务。

    boost::asio::io_context io_context;

要执行 I/O 操作,你的程序将需要I/O 对象(I/O object)(如TCP 套接字):

    boost::asio::ip::tcp::socket socket(io_context);

执行同步连接操作时,将发生以下事件序列:

  1. 你的程序通过调用I/O 对象启动连接操作:

    socket.connect(server_endpoint);
    
  2. I/O 对象将请求转发到I/O 执行上下文

  3. I/O 执行上下文调用操作系统来执行连接操作。
  4. 操作系统将操作结果返回到I/O 执行上下文
  5. I/O 执行上下文将操作导致的任何错误转换为boost::system::error_code类型的对象。error_code可与特定值进行比较,或作为布尔值进行测试(false结果表示未发生错误)。然后将结果转发回I/O 对象
  6. 如果操作失败,I/O对象将引发boost::system::system_error类型的异常。如果启动操作的代码已编写为:

    boost::system::error_code ec;
    socket.connect(server_endpoint, ec);
    

    然后error_code变量ec将设置为操作的结果,并且不会引发异常。

使用异步操作时,将发生不同的事件序列。

async_op1

  1. 你的程序通过调用I/O 对象启动连接操作:

    socket.async_connect(server_endpoint, your_completion_handler);
    

    其中your_completion_handler是具有签名的函数或函数对象:

    void your_completion_handler(const boost::system::error_code& ec);
    

    所需的准确签名取决于正在执行的异步操作。参考文档指示每个操作的适当形式。

  2. I/O 对象将请求转发到I/O 执行上下文

  3. I/O 执行上下文操作系统发出信号,表明它应启动异步连接。
    时间流逝。(在同步情况下,此等待将完全包含在连接操作的持续时间内。)
    async_op2
  4. 操作系统通过将结果放在队列中,表示连接操作已完成,准备由I/O 执行上下文拾取。
  5. 当使用io_context作为I/O 执行上下文时,你的程序必须调用io_context::run()(或调用类似的io_context成员函数)才能检索结果。 对io_context::run()的调用会在有未完成的异步操作时阻塞,因此通常在启动第一个异步操作后立即调用它。
  6. 在调用io_context::run()中,I/O执行上下文将操作的结果移出队列,并转换为error_code,然后将其传递到你的完成处理程序(your completion handler)

这是 Boost.Asio 操作方式的简化图。如果您的需求更高级,例如扩展 Boost.Asio 以执行其他类型的异步操作,您将需要进一步深入研究文档。


Copyright © 2003-2020 Christopher M. Kohlhoff

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注