Boost.Asio的基本剖析(Basic Boost.Asio Anatomy)

Boost.Asio的基本剖析(Basic Boost.Asio Anatomy


原文链接:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/core/basics.html


Boost.Asio可以以同步或者异步方式应用于如socket这样的I/O对象。在使用Boost.Asio之前,我们或许最好先来看一下你的程序以及Boost.Asio各个部分是如何协同工作的。作为引入的例子,不妨考虑当我们在socket上进行一个连接操作时到底发生了什么。先讨论同步形式连接操作的情形。

 Boost.Asio的基本剖析(Basic Boost.Asio Anatomy)_第1张图片

你的程序至少要有一个io_service对象。它建立起了你的程序与操作系统I/O服务之间的连接

boost::asio::io_service io_service; 

为了执行I/O功能,你的程序需要一个I/O对象,例如TCP socket 

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


当一个同步的连接操作进行时,会引发如下调用事件:

1、你的程序调用I/O对象初始化连接操作

socket.connect(server_endpoint);

2、I/O对象将连接请求传送给io_service。

3、io_service向下调用操作系统执行连接操作。

4、操作系统将操作结果返回给io_service。

5、如果返回值中带有错误码,io_service将这些错误码转换为 boost::system::error_code对象。一个error_code可能是一个特 殊的值或者boolean码。之后这个结果将被发回给I/O对象。

6、如果连接失败,I/O对象将抛出boost::system::system_error异常。 当初始化连接的代码写为如下形式时,ec将被设为操作返回值 (false代表无错),I/O不再抛出异常。

boost::system::error_code ec;

socket.connect(server_endpoint, ec);



不同于同步形式,当一个异步的连接操作进行时,会引发如下调用事件:

Boost.Asio的基本剖析(Basic Boost.Asio Anatomy)_第2张图片

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对象将请求发送给io_service。

3、Io_service通知操作系统它将要开启一个异步连接。

4、一段时间过去(异步操作)。

Boost.Asio的基本剖析(Basic Boost.Asio Anatomy)_第3张图片

5、操作系统通过将操作结果放入一个队列,指示连接操作已经顺利完成 结果将很快被io_service取走。

6、你的程序必须要显式地执行io_service::run()或者io_service的其他 类似成员函数去取回操作系统的返回值。如果有未完成的异步操作, io_service::run()将被阻塞,因此通常来讲,在开始你的第一个异步 操作时,就应当调用这个函数。

7、在调用io_service::run()方法时,io_service将操作结果从队列取出 并转换为一个error_code传给你的your_completion_handler。


这便是Boost.Asio运作原理的简单流程图。如果你想了解更多可以钻研参考文档,例如如何用extending Boost.Asio实现其他类型的异步操作。

你可能感兴趣的:(异步,同步,boost,asio)