ACE作为通讯方面的开源架构,不但用c++实现,而且用JAVA实作的架构已经可以使用了,由此看来掌握ACE成为每歌开发通讯程序的程序员的必备技能。 ACE的库分为4个层次: l OS适配层该层将ACE的较高层和与OS机制相关联的平台特有的依赖屏蔽开来。 l OO包装层封装并增强在像Win32和UNIX这样的现代操作系统上可用的并发、进程间通信(IPC)、以及虚拟内存机制。应用可以通过有选择地继承、聚合(aggregating)、和/或实例化ACE包装类属来合并和编写这些组件 l 框架 包括反应器,服务配置器,流。 l 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上,并向其注册:当在PEER_ADDR上发生ACCEPT事件,调用handle_input成员挂钩函数。 2.主程序调用ACE_Reactor的handle_events()时,检测到ACCEPT,调用ACE_Acceptor的handle_input()。在Handle_Input中继续调用虚函数make_svc_handle()构造出ACE_Svc_Handler类(可以新建,则每客户一个Handler,也可使用单例,则多个客户共用一个服务处理器)。接着调用accept_ svc_handle(),将具体的参数传给ACE_Svc_Handler。最后调用active_ svc_handle(),一般调用ACE_Svc_Handler的open函数。在Open函数中注册反应器事件,如必要调用active()创建出线程。 我们把创建接收器的线程称为主线程,把运行Ace_Reactor的handle_events()的线程取名为事件分发线程。把运行ACE_Svc_Handler的svc()的线程叫做服务线程。这些线程根据实现不同会有以下几种组合。 l 主线程,事件分发线程,服务线程三者合一 在ACE_Svc_Handler的open函数中不调用active(),则服务不创建新的线程。 l 主线程,事件分发线程合一,服务线程运行 在ACE_Svc_Handler的open函数中调用active(),则服务线程创建,线程运行ACE_Svc_Handler的svc()。 l 主线程运行,事件分发线程和服务线程合一。 后叙述 l 主线程,事件分发线程,服务线程都运行 在ACE_Svc_Handler的open函数中调用active();
在ACE_Svc_Handler中关闭操作的默认行为要比在open()中初始化的代码更为复杂。这是因为关闭时的挂勾函数包含了反应式(reactive)关闭和主动式(active-object)关闭两种情况,它们有相同的效果:删除所有在反应器注册的事件和确保删除ACE_Svc_handler的派生类的对象。
反应式关闭(handle_close()): 当以下形况发生时被调用:
因此,不管ACE_Svc_Handler对象是反应式还是主动式,结束时的清理工作都在相同的地方:ACE_Svc_Handler::destroy()。如果对象是动态分配且 不是ACE_Stream框架中的组成部分,destroy()将删除此对象,如果对象不是动态分配的,析构它的责任是创建时对象所在的封闭范围。如果对象是ACE_Stream的模块的组成部分,流和/或控制流的代码负责管理对象的生命期。destroy()函数应遵守这样的规则来避免出现资源泄漏。
如果处理器与反应器是关联的: 最后感谢此文原创者,本文来源:http://hi.baidu.com/99916742/blog/item/08f74cfcff7beb4dd6887ddf.html |
ACE_Svc_Handler 通信原理(转)
最新推荐文章于 2024-07-02 14:52:29 发布