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上进行一个连接操作时到底发生了什么。先讨论同步形式连接操作的情形。

 

你的程序至少要有一个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实现其他类型的异步操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值