基本 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 套接字:
当执行同步连接操作时,会发生以下一系列事件:
程序通过调用 I/O 对象启动连接操作:
socket.connect(server_endpoint);I/O 对象将请求转发给 I/O 执行上下文。
I/O 执行上下文调用操作系统来执行连接操作。
操作系统将操作结果返回给 I/O 执行上下文。
I/O 执行上下文将操作的任何错误转换为
boost::system::error_code类型的对象,并将结果传递回 I/O 对象。如果操作失败,I/O 对象会抛出
boost::system::system_error异常。如果代码写成:boost::system::error_code ec; socket.connect(server_endpoint, ec);那么错误代码ec会被设置为操作结果,不会抛出异常。
当使用异步操作时,事件的顺序有所不同:

程序调用 I/O 对象启动连接操作:
socket.async_connect(server_endpoint,your_completion_handler);your_completion_handler是一个带有以下签名的函数或函数对象:void your_completion_handler(const boost::system::error_code& ec);I/O 对象将请求转发给 I/O 执行上下文。
I/O 执行上下文通知操作系统启动异步连接。
操作系统通过将结果放入队列通知操作完成,等待 I/O 执行上下文取回。
使用
io_context作为 I/O 执行上下文时,程序必须调用io_context::run()以检索操作结果。调用io_context::run()会阻塞,直到所有异步操作完成。在
io_context::run()内,I/O 执行上下文从队列中取回操作结果,将其转换为error_code,并将其传递给完成处理程序。
时间流逝…… (在同步情况下,这种等待会完全包含在连接操作的持续时间内)。

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