* 架构浅析

先来看一下asio的0层的组件图。

                                   (图1.0)

io_object是I/O对象的集合,其中包含大家所熟悉的socket、deadline_timer等对象,主要功能是提供接口给用户使用。

services服务是逻辑功能的实现者,其中包含提供定时功能的deadline_timer_service、提供socket相关功能的win_iocp_socket_service(windows平台)/reactive_socket_service(其他平台)、作为io_service功能的真正实现者win_iocp_io_service(windows平台)/task_io_service(其他平台)等等服务。

"Asio核心组件"在这一层中可以理解为就是io_service,它通过关联的类service_registry将实现具体功能所需的服务组合起来,再由io_object提供接口给用户使用。
      这三大组件构成了asio的核心架构,asio的一切都是以此为根基衍生扩展出来的。

让我们将图1.0进一步细化:
                            
                                  (图1.1)

“Asio核心组件”细化为4个类:io_service,service_registry,service,service_base。其中,service_registry负责管理所有服务,使用延迟创建技术,在真正使用服务对象的时候才创建服务对象,并以单链表的方式管理,但只能增不能删,直到service_registry析构时才会释放其管理的服务对象。service是io_service的类中类,是一个虚基类,所有由service_registry管理的服务都必须从service派生。service_base是service的直接派生类,是services继承体系的第二级,组合了service_id<Type>,目前asio中所有服务均继承与service_base。
      “I/O对象”细化为basic_io_object及其派生类。basic_io_object是所有I/O对象的基类,提供I/O对象与其对应服务的联系。

再将图1.1进一步细化(关注网络I/O方面的一些类,其他方面的类未画出):

(图1.2)

io_service的真正逻辑实现封装在内部桥接的类io_service_impl中,io_service_impl是一个typedef(在windows平台下是win_iocp_io_service,其他平台下是task_io_service)。io_service_impl就是一个继承于service_base的服务,在io_service初始化也就是其关联类service_registry初始化时被创建,再由io_service持有其引用。

从图中可以看到,继承于service_base的服务有:

strand_service:提供串行化多线程调用的功能

deadline_timer_service:提供定时器功能

stream_socket_service:提供流式socket相关功能

datagram_socket_service:提供报文式socket相关功能

seq_packet_socket_service:提供seq_packet socket相关功能

raw_socket_service:提供原始套接字相关功能

socket_acceptor_service:提供端口监听和接受客户端连接相关功能

      这些服务都是幕后英雄,对于用户而言是感知不到的,用户使用的都是其对应的I/O对象。

这些服务对应的I/O对象是:

io_service::strand

basic_deadline_timer

basic_stream_socket

basic_datagram_socket

basic_seq_packet_socket

basic_raw_socket

basic_socket_acceptor

除此之外,asio中还有串口通信、信号处理等功能,在此不再一一赘述。

由于本文会实时根据读者反馈的宝贵意见更新,为防其他读者看到过时的文章,因此本系列专题谢绝转载!

boost.asio源码剖析(二) ---- 架构浅析的更多相关文章

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

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

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

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

  3. boost.asio源码剖析

    一. 前 言二. 架构浅析三. 流程分析     * 常见流程分析之一(Tcp异步连接)      * 常见流程分析之二(Tcp异步接受连接)      * 常见流程分析之三(Tcp异步读写数据)   ...

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

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

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

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

  6. boost.asio源码阅读(2) - task_io_service

    1.0 task_io_service 在boost.asio源码阅读(1)中,代码已经查看到task_io_service中. 具体的操作调用void task_io_service::init_t ...

  7. Django Rest Framework源码剖析(二)-----权限

    一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...

  8. Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...

  9. boost.compressed_pair源码剖析

    意义 当compressed_pair的某一个模板参数为一个空类的时候将对其进行“空基类优化”,这样可以使得compressed_pair占用的空间比std::pair的更小. 参考如下代码: #in ...

随机推荐

  1. C++11 多线程

    C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用 ...

  2. 终于把你必须知道的.NET看完了

    终于把你必须知道的.NET看完了,第二步就是把精通ASP.NET MVC3框架这本书搞定,练习MVC3的使用,并把EF,LINQ也练习一下,期间要做一个项目“多用户微信公众平台”项目,最近微信公众平台 ...

  3. Windows Azure存储容器私有,公共容器,公共Blob的区别

    当我们在Windows Azure中创建或编辑存储的容器时,需要选择访问类型,本文将描述一下这三个选项的区别. 1. 私有: 默认选项,顾名思义,用户不能通过URL匿名进行访问容器或容器内的任何Blo ...

  4. 第三百二十二天 how can I 坚持

    昨晚好像一直在做梦,模模糊糊的,其实很难受. 真不知道该怎么办了,是没有勇气,还是怕什么,总之, 不知道该咋办了. 搞不懂. 回来第二天了,节奏又一点的开始了,一年又会很快过去. 刘松说要来北京,整天 ...

  5. 第一百九十三天 how can I 坚持

    我以为我是谁. 你可以记录你今天看了电影 也可以记录你最近在听什么歌 但这都会成为回忆 .  ---oncelife 快受不了了啊.咋办. 今天看了<滚蛋吧,肿瘤君>,还看了<那山那 ...

  6. WebRTC源码分析:音频模块结构分析

    一.概要介绍WebRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输.上图中有三个Chann ...

  7. HDU 1525 Euclid's Game (博弈)

    Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. 应用TcpListener实现的socket服务器端

    前言 项目中要实现一个简单的socket服务器端,采用了TcpListener这个类.除了基本的功能之外,有几处需要注意的点. 要能同时接收多个客户端的连接,当然,不需要几千个那么多. 要能探测到客户 ...

  9. hdu 5491 The Next (位运算)

    http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意:给定一个数D,它的二进制数中1的个数为L,求比D大的数的最小值x且x的二进制数中1的个数num满 ...

  10. poj 1564 Sum It Up (DFS+ 去重+排序)

    http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...