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上进行一个连接操作时到底发生了什么。先讨论同步形式连接操作的情形。
你的程序至少要有一个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);
不同于同步形式,当一个异步的连接操作进行时,会引发如下调用事件:
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、一段时间过去(异步操作)。
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的基本剖析(Basic Boost.Asio Anatomy)
原文:http://blog.csdn.net/jmy5945hh/article/details/19639545