Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。
作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子
你的程序需要一个io_service对象,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可能同特定的值进行比较,或者作为一个boolen(false结果意味着没有错误发生),结果被传送会I/O对象。
6.如果操作失败I/O对象抛出一个异常boost::system::error_code,如果启动操作被替换成下面的写法
boost::system::error_code ec;
socket.connect(server_endpoint, ec);
那么操作结果被写入error_code类型变量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.操作系统把操作结果放在一个队列中来指示连接启动完成,供io_service提取结果
5.你的程序通过调用io_service::run()(获取另外一些类似的io_service成员函数)来获取操作结果,如果有未完成的异步操作io_service::run()将阻塞,你必须在启动你的异步操作后周期性的调用它。
6.在io_service::run()内部,io_service把操作结果出列,并传送给your_completion_handler
这就是Boost::Asio工作的简要流程,如果你想要了解进阶功能,比如把Boost::Asio扩展到其他类型的异步操作,你需要更深入的去理解。

Boost::Asio入门剖析的更多相关文章

  1. boost.asio源码剖析(五) ---- 泛型与面向对象的完美结合

    有人说C++是带类的C:有人说C++是面向对象编程语言:有人说C++是面向过程与面向对象结合的语言.类似的评论网上有很多,虽然正确,却片面,是断章取义之言. C++是实践的产物,C++并没有为了成为某 ...

  2. boost.asio源码剖析(一) ---- 前 言

    * 前言 源码之前,了无秘密.                                                       ——侯捷 Boost库是一个可移植.提供源代码的C++库,作 ...

  3. boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)

    * Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protoc ...

  4. boost.asio源码剖析(三) ---- 流程分析

    * 常见流程分析之一(Tcp异步连接) 我们用一个简单的demo分析Tcp异步连接的流程: #include <iostream> #include <boost/asio.hpp& ...

  5. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

  6. 使用Boost.Asio编写通信程序

    摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...

  7. Boost.Asio技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  8. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  9. c++ boost asio库初学习

    前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...

随机推荐

  1. UVa 11992 (线段树 区间修改) Fast Matrix Operations

    比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...

  2. [转:CSS3-前端] CSS3发光和多种图片处理

    原文链接:http://www.qianduan.net/css3-image-styles.html 一些上流的CSS3图片样式 神飞 发表于 24. Sep, 2011, 分类: CSS , 46 ...

  3. POJ 2446 Chessboard (二分图匹配)

    题意 在一个N*M的矩形里,用1*2的骨牌去覆盖该矩形,每个骨牌只能覆盖相邻的两个格子,问是否能把每个格子都盖住.PS:有K个孔不用覆盖. 思路 容易发现,棋盘上坐标和为奇数的点只会和坐标和为偶数的点 ...

  4. error C2471: 无法更新程序数据库 vc90.pdb

    error C2471: 无法更新程序数据库“d:/Work/ Project/debug/vc90.pdb” fatal error C1083: 无法打开程序数据库文件:“d:/Work/ Pro ...

  5. java运用FFMPEG视频转码技术

    基于windows系统安装FFMPEG转码技术 http://wenku.baidu.com/link?url=z4Tv3CUXxxzLpa5QPI-FmfFtrIQeiCYNq6Uhe6QCHkU- ...

  6. excel用vlookup,lookup时查询数据需要排序

    如题,排出来的数据不对,之前没有是看清楚..所以记下来,日是后要小心点....

  7. 【转】使用NetBeans和Eclipse开发PHP应用程序

    [51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...

  8. Dev gridControl 添加表标题

    1.OptionsView ->ShowViewCaption = True 2.ViewCaption = "标题"

  9. list用法详解

    在这里感谢大牛们的奉献!此致敬礼! 本文转载自百度文库.作者如下.其中下面的count, count_if等函数的使用有些陈旧,如在编译时遇到问题,请百度. 标准模板库(STL)介绍 作者:Scott ...

  10. <转>python version 2.7 required,which was not found in the registry

    安装PIL-1.1.7.win32-py2.7的时候,不能再注册表中识别出来python2.7 方法:新建一个register.py 文件,把一下代码贴进去,保存 # # script to regi ...