@john-lee
2021-01-01T17:00:41.000000Z
字数 1729
阅读 864
Boost.Asio
Boost.Asio 可用于对 I/O 对象(如套接字)执行同步和异步操作。在使用 Boost.Asio 之前,获取 Boost.Asio 的各个部分的概念图,以及它们如何协同工作可能很有用。
作为介绍性示例,让我们考虑在套接字上执行连接操作时会发生什么。我们将从检查同步操作开始。
你的程序(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);
执行同步连接操作时,将发生以下事件序列:
你的程序通过调用I/O 对象启动连接操作:
socket.connect(server_endpoint);
I/O 对象将请求转发到I/O 执行上下文。
boost::system::error_code
类型的对象。error_code
可与特定值进行比较,或作为布尔值进行测试(false
结果表示未发生错误)。然后将结果转发回I/O 对象。如果操作失败,I/O对象将引发boost::system::system_error
类型的异常。如果启动操作的代码已编写为:
boost::system::error_code ec;
socket.connect(server_endpoint, ec);
然后error_code
变量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 执行上下文。
io_context
作为I/O 执行上下文时,你的程序必须调用io_context::run()
(或调用类似的io_context
成员函数)才能检索结果。 对io_context::run()
的调用会在有未完成的异步操作时阻塞,因此通常在启动第一个异步操作后立即调用它。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)