ACE作为通讯方面的开源架构,不但用c++实现,而且用JAVA实作的架构已经可以使用了,由此看来掌握ACE成为每歌开发通讯程序的程序员的必备技能。

ACE的库分为4个层次:

OS适配层该层将ACE的较高层和与OS机制相关联的平台特有的依赖屏蔽开来。

OO包装层封装并增强在像Win32和UNIX这样的现代操作系统上可用的并发、进程间通信(IPC)、以及虚拟内存机制。应用可以通过有选择地继承、聚合(aggregating)、和/或实例化ACE包装类属来合并和编写这些组件。

框架包括反应器,服务配置器,流。

ACE的通讯模式包括接受器-连接器,前摄器两种主要的通讯模式。

前摄器理解可以理解为象Windws的Overlapper形式的一种利用操作系统的挂钩进行快速异步处理IO通讯的一种方式。它在某种程度上类似于一种软中断。用户只负责编写并注册相应的挂钩,操作系统负责j监测事件发生,并调用相应的挂钩。

接受器-连接器模式是我们经常使用的通讯模式。相对于连接器,接收器模式是服务器处理程序经常重复编写的救世主。程序员在编写服务器处理程序时,无论是采用异步通讯还是阻塞通讯,单个线程还是多个线程,都可以采用接收器方式,由此可见接受器-连接器模式的强大。

接受器-连接器模式的服务器端用接收器,客户端使用连接器连接服务器(当然可以采用其他方式连接到采用接收器的服务器上),相对于连接器,接受器简化了服务端编程的复杂度,使程序员从大量重复的工作中解脱出来,并且编写出成熟稳定的服务处理程序,对比以前只有少数具有丰富的通讯程序编写经验的人才能写出稳定健壮的服务处理程序(如web服务器),ACE的接收器可以称之为改写这一历史的巨人。接受器模式是ACE中最闪耀之处,是通讯程序编写史上的分水岭,他的强大足以使我们震惊。

在ACE文档方面,尽管有马维达翻译的Douglas C.Schmidt和Huston编写的《C++网络编程》卷1,卷2,还有《ACE技术论文集》,《ACE程序员教程》《ACE应用实例》,但是领悟ACE的接收器不是一件容易的事情。原因也许归于开源项目的一个通病--文档比较生僻难懂,或者不全面。所以开源项目领悟的最好方法是结合文档读源代码。

接收器主要有ACE_Acceptor, ACE_Svc_Handler, ACE_Reactor 3个主要类组成。ACE_Reactor是分发器(Dispatcher), ACE_Acceptor创建出ACE_Svc_Handler.

处理顺序是:

1.ACE_Acceptor的open将自身帮定到ACE_Reactor上,并向其注册;

2.主程序调用ACE_Reactor的handle_events或run_reactor_event_loop时,

检测到ACCEPT,调用  ACE_Acceptor的handle_input。

3.ACE_Acceptor的虚函数make_svc_handle构造出ACE_Svc_Handler类。

接着调用accept_svc_handle,将具体的参数传给ACE_Svc_Handler。最后调用active_svc_handle

一般调用ACE_Svc_Handler的open函数。在Open函数中注册反应器事件,如必要调用active创建出线程。

我们把创建接收器的线程称为主线程,把运行Ace_Reactor的handle_events()的线程取名为事件分发线程。把运行ACE_Svc_Handler的svc()的线程叫做服务线程。这些线程根据实现不同会有以下几种组合。

1.主线程,事件分发线程,服务线程三者合一

在ACE_Svc_Handler的open函数中不调用active(),则服务不创建新的线程。

2.   主线程,事件分发线程合一,服务线程运行

在ACE_Svc_Handler的open函数中调用active(),则服务线程创建,线程运行ACE_Svc_Handler的svc。

3.  主线程运行,事件分发线程和服务线程合一。

4.  主线程,事件分发线程,服务线程都运行

在ACE_Svc_Handler的open函数中调用active;

另创建一个线程,循环运行ACE_Reactor的handle_events()或者run_event_loop();

另外一篇:

在ACE_Svc_Handler中关闭操作的默认行为要比在open()中初始化的代码更为复杂。这是因为关闭时的挂勾函数包含了反应式(reactive)关闭和主动式(active-object)关闭两种情况,它们有相同的效果:删除所有在反应器注册的事件和确保删除ACE_Svc_handler的派生类的对象。

反应式关闭(handle_close()): 当以下形况发生时被调用:

1) 事件回调函数(译注:handle_xxxx())返回-1时,或

2) 调用ACE_Reactor::remove_handler(),传入的标记不含 DONT_CALL时

反应器框架将调用handle_close()挂勾函数。 ACE_Svc_handler::handle_close()的默认行为是调用ACE_Svc_Handler::destroy()销毁事件处理器。

主动对象式关闭(close()): 当ACE_Svc_Handler 派生的对象通过activate()函数转变为主动对象,处理器的的svc()方法在它产生的线程中运行后进行回调。当svc()返回时,线程退出,但在它要退出时,仍在将要退出线程的上下文中,ACE_Task框架调用它的close()方法。ACE_Svc_Handler::close()方法调用handle_close()完成服务处理器的清理工作。

因此,不管ACE_Svc_Handler对象是反应式还是主动式,结束时的清理工作都在相同的地方:ACE_Svc_Handler::destroy()。如果对象是动态分配且不是ACE_Stream框架中的组成部分,destroy()将删除此对象,如果对象不是动态分配的,析构它的责任是创建时对象所在的封闭范围。如果对象是ACE_Stream的模块的组成部分,流和/或控制流的代码负责管理

对象的生命期。destroy()函数应遵守这样的规则来避免出现资源泄漏。

无论ACE_Svc_Handler对象是反应式销毁还是主动式销毁,都会引起相同的事情发生:~ACE_Svc_Handler() (处理器的析构函数)调用ACE_Svc_Handler::shutdown()函数完成服务处理器的清理工作。shutdown()执行的这些清理操作是:

如果处理器与反应器是关联的:   取消处理器关联的所有定时器。   为处理器的流对象(如socket)删除所有已注册的事件。

如果处理器与再生器(recycler)是关系的,从再生器中清除处理器。关闭流对象。

因此,我们看到的绝大多数情况服务处理器通过shutdown需要通过框架来清理工作,都是简单的允许缺省的挂勾函数得以被调用。如果你的应用程序需求更多的关闭/清理规则,推

荐的地方是你的处理器的handle_close()挂勾方法。仅仅是确保把ACE_Svc_Handler::destroy()函数人作为你的handle_close()的最后一个动作,与框架清理行为的余下的行为合并

ACE_Svc_Handler 通信原理的更多相关文章

  1. 基于web的IM软件通信原理分析

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

  2. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  3. SSL 通信原理及Tomcat SSL 配置

    SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...

  4. Java 下 SSL 通信原理及实例

    有关SSL的原理和介绍在网上已经有不少,对于Java下使用keytool生成证书,配置SSL通信的教程也非常多.但如果我们不能够亲自动手做一个SSL Sever和SSL Client,可能就永远也不能 ...

  5. AIDL通信原理

    AIDL (Android Interface Definition Language),通过定义通信接口来实现进程间通信.这是Google提供的一种在安卓应用进程间通信的工具.所以要了解AIDL的通 ...

  6. Java基础知识强化之网络编程笔记02:Socket通信原理图解

    1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网 ...

  7. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  8. RS-232通信原理

    rs232串口通信原理 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆).大多数计算机包含两个基于RS232的串口.串口同时也是仪器 ...

  9. SSL 通信原理及Tomcat SSL 双向配置

    SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...

随机推荐

  1. Binary Tree Iterative Traversal

    Preorder class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<in ...

  2. [POI2012]Festival

    题目大意: 有$n$个正整数$x_1,x_2,\ldots,x_n$,再给出一些限制条件,限制条件分为两类: 1.给出$A,B$,要求满足$X_A+1=X_B$: 2.给出$C,D$,要求满足$X_C ...

  3. 分享最新申请IDP账号的过程,包含duns申请的分享(2013年6月)

    5月份接到公司要申请开发者账号的任务,就一直在各个论坛找申请的流程,但都是一些09年10年的比较旧的流程,现在都已经不适用了,好不容易找到2012年分享的流程吧,才发现申请过程中少了DUNS编码的步骤 ...

  4. Scala各种符号含义;scala =>符号含义总结

    符号: <- :for循环 -> :map映射 => :匿名函数 Int= :scala函数 _ :通配符 https://blog.csdn.net/bon_mot/article ...

  5. GTK+重拾--09 GTK+中的组件(一)

    (一):写在前面 在这篇文章中主要介绍了GTK+程序中的各种构件,这是解说构件的第一个部分,另外一部分将在下一个小节中讲到. 构件是建立一个GUI程序的基础.在GTK+的长期发展过程中.一些特定的构件 ...

  6. ES6里关于函数的拓展(一)

    一.形参默认值 Javascript函数有一个特别的地方,无论在函数定义中声明了多少形参,都可以传入任意数量的参数,也可以在定义函数时添加针对参数数量的处理逻辑,当已定义的形参无对应的传入参数时为其指 ...

  7. ElasticSearch 专业术语

    1.Analysis(分析) 分析的过程就是将全文(full text)转换成 术语/分词(terms). 这取决于使用那个分析器,这些短语:“FOO BAR”, “Foo-Bar”, “foo,ba ...

  8. VirtualBox下Linux(centos)扩展磁盘空间

    最近在Linux里做文件合并,做分词,磁盘空间不够,把扩展磁盘空间方法记录一下. 1.在VirtualBox安装路径下(例如C:\Program Files\Oracle\VirtualBox> ...

  9. Linux内核性能测试工具全景图

    1.Linux性能监控工具及对应的内核层 2.Linux性能基础测试工具及对应内核层 3.Linux性能监控工具Sar及对应内核层 4.Linux性能调优工具及对应的内核层

  10. Node.js 网页瘸腿稍强点爬虫再体验

    这回爬虫走得好点了,每次正常读取文章数目总是一样的,但是有程序僵住了情况,不知什么原因. 代码如下: // 内置http模块,提供了http服务器和客户端功能 var http=require(&qu ...