逆风起笔
c++ and web developer
主页
分类
标签
归档
About Me
友链
My Github
Proudly powered by
Leanote
Theme by ©
mrbird
文章 - Boost.Asio 初探
Dark
Boost.Asio 初探
? Boost ?
? Asio ?
? C++ ?
发布于
2017-12-15
611人围观 0条评论
? Boost ?
? Asio ?
? C++ ?
发表于
2017-12-15
611人围观 0条评论
# Boost.Asio 初探 简而言之,通过利用Boost.Asio,I/O对象可以执行异步/同步的操作。在使用Asio之前,先介绍Asio的工作原理。分为两种情况,同步和异步。 ## 同步 同步情况下,当socket执行一个连接(connect)操作时,工作原理如下图: ![title](https://leanote.com/api/file/getImage?fileId=5a33b1adab64413ae6001d10) 如图中所示,你的程序需要一个I/O对象(如socket),一个`io_service`对象,`io_service`对象可以理解为调度器,其主要作用是将程序和操作系统的I/O服务相连。 ```cpp // 通过asio库,新建io_service对象 boost::asio::io_service io_service; // 利用io_service对象构造I/O对象,比如TCP套接字 boost::asio::ip::tcp::socket socket(io_service); ``` 当一个异步连接操作发生时,会有如下事件发生: 1. 调用I/O对象,进行连接操作的初始化 ```cpp \\ 初始化连接操作,即指出所监听的端口 socket.connect(server_endpoint); ``` 2. I/O对象将请求转发给`io_service`对象 3. `io_service`对象调用系统的I/O服务进行连接操作 4. 操作系统将操作结果返回给`io_service`对象 5. `io_service`将操作结果中的任何错误传入一个`boost::system::error_code`类型的对象中去。`error_code`可以与特定值进行比较,或者作为布尔值进行判断(比如,false表示没有发生错误)。接着,`io_service`将结果转发回I/O对象。 6. 如果操作失败,则`io_service`将跑出类型为`boost::system::system_error`的异常。如果代码如下: ``` boost::system::error_code ec; socket.connect(server_endpoint, ec); ``` 则不会有异常抛出,取而代之的是,将`error_code`变量的值传入ec中返回。 ## 异步 异步的工作原理与同步不一样,如下图: ![title](https://leanote.com/api/file/getImage?fileId=5a33b675ab644138dd001c8b) 事件发生顺序如下: 1. 调用I/O对象,进行连接的初始化 ```cpp socket.async_connect(server_endpoint, your_completion_handler); ``` 与同步一样,`server_endpoint`为端口,`your_completion_hander`为函数或者函数对象,函数签名如下: ```cpp void your_completion_handler(const boost::system::error_code& ec); ``` 精确的函数签名还依赖于所执行的具体的异步操作,详情参考文档中不同异步操作对应的函数签名 2. I/O对象转发请求给io_service 3. io_service通知操作系统执行一个异步连接操作 一段时间过去后(注意,在同步操作中,这段时间包含在连接的持续时间内,而异步并不会等待而是立即返回),发生如下图的事件队列: ![title](https://leanote.com/api/file/getImage?fileId=5a33b881ab644138dd001cb0) 4. 操作系统完成连接时,会将结果放在队列中,以供`io_service`调取 5. 程序必须调用`io_service::run()`来获取连接的结果,如果此时队列有结果,则取出结果;如果此时队列无结果并且有尚未完成的连接的操作,则阻塞,等待连接结果完成并获取结果;如果此时队列无结果,也没有尚未完成的连接操作,则立即返回 6. 调用`io_service::run()`时,`io_service`会不断从队列中获取结果,并得到`error_code`,传入`your_completion_handler` ## 参考 [Basic Boost.Asio Anatomy](http://www.boost.org/doc/libs/master/doc/html/boost_asio/overview/core/basics.html)
上一篇:
2018年南京的第一场雪
下一篇:
图片转ascii码文本
0
赞
提交评论
立即登录
,发表评论
没有帐号?
立即注册
0
条评论
More...
没有帐号?立即注册