基本 Boost.Asio 剖析

Boost.Asio 可用于对 I/O 对象(如套接字)执行同步和异步操作。在使用 Boost.Asio 之前,了解其各个部分、程序结构以及它们如何协同工作是很有帮助的。

作为介绍性示例,假设在套接字上执行连接操作。我们先从同步操作开始分析。

您的程序至少需要一个 I/O 执行上下文(I/O Execution Contex),例如 boost::asio::io_context 对象、boost::asio::thread_pool 对象或 boost::asio::system_context。此 I/O 执行上下文代表了程序与操作系统 I/O 服务之间的连接。

要执行 I/O 操作,程序需要一个 I/O 对象(I/O Object),如 TCP 套接字:

当执行同步连接操作时,会发生以下一系列事件:

  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 类型的对象,并将结果传递回 I/O 对象。

  6. 如果操作失败,I/O 对象会抛出 boost::system::system_error 异常。如果代码写成:boost::system::error_code ec; socket.connect(server_endpoint, ec);那么错误代码 ec 会被设置为操作结果,不会抛出异常。

当使用异步操作时,事件的顺序有所不同:

  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 执行上下文通知操作系统启动异步连接。

  4. 操作系统通过将结果放入队列通知操作完成,等待 I/O 执行上下文取回。

  5. 使用 io_context 作为 I/O 执行上下文时,程序必须调用 io_context::run() 以检索操作结果。调用 io_context::run() 会阻塞,直到所有异步操作完成。

  6. io_context::run() 内,I/O 执行上下文从队列中取回操作结果,将其转换为 error_code,并将其传递给完成处理程序。

时间流逝…… (在同步情况下,这种等待会完全包含在连接操作的持续时间内)。

这是一幅简化的 Boost.Asio 运行图。如果有更高级的需求,例如扩展 Boost.Asio 执行其他类型的异步操作,建议深入研究文档。

Last updated