ACE-Reactor框架

Reactor是一种事件驱动型构架,ACE_Reactor模式减轻了程序员对底层网络IO事件监视的负担,一般情况下程序员只要继承ACE_Event_Handler类,重写相关的接口处理函数,然后向ACE_Reactor的对象注册相关事件即可,事件的定义在ACE_Event_Handler类中有相关定义。

研究Reactor先研究一下C++的桥接模式:

设计模式一:桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化。

设计模式二:Facade设计模式,定义了用于应用程序访问ACE_Reactor框架的接口,为不同同步类型的管理器提供数据成员和统一的接口

管理器:

ACE_Dev_Poll_Reactor:  基于poll调用的Reactor管理器

ACE_Select_Reactor_T:  基于select调用的Reactor管理器

ACE_WFMO_Reactor:     基于WaitForMultipleObjects调用的Reactor管理器

ACE_TP_Reactor:          基于select调用,采用线程池调度的Reactor管理器

Reactor框架:

先上ACE_Event_Handler

ACE_Event_Handler_T

Enable a class that doesn‘t inherit from the ACE_Event_Handler to be incorporated into the ACE_Reactor framework. Thanks to Greg Lavender ([email protected]) for sharing this idea.

It is sometimes the case that an application has a hierarchy of operation dispatcher classes that have their own inheritance hierarchy but also would like to integrate with the ACE_Reactor. Rather than adopt a "mixin" approach, it is often cleaner to define a template as a subclass of ACE_Event_Handler and paramterize it with an operation dispatcher type. When constructing an instantiation of the ACE_Event_Handler_T object, a set of pointers to member functions must be provided so that when one of the handle_* methods is called by the ACE_Reactor, the appropriate method is called on the underlying operations object. This is done since in some cases it is useful to map any event that happens to the same method on an object. The ACE_Event_Handler_T template is instantiated by an operations object and registered with the ACE_Reactor, and it then calls the appropriate op_handler. So, it‘s basically just another level of indirection in event dispatching. The coupling betweent the ultimate handler of the event and the ACE_Event_Handler class is relaxed a bit by have this intermediate <op_handler_> object of type <T> around. The client object can then dynamically change the bindings for the various handlers so that during the life of one of the operation objects, it can change how it wants events to be handled. It just instantiates a new instance of the template with different bindings and reregisters this new object with the ACE_Reactor.

(摘自http://doc.uh.cz/C_C%2B%2B/ACE/ace/classACE__Event__Handler__T.html#_details)简单的说就是实现了不同类的方法也可以融合到ACE_Reactor 中进行调用。

实例:(书本的常规方法实现)

Handle_Data.h

#include "ace/Event_Handler.h"
#include "ace/SOCK_Stream.h"
#include "ace/INET_Addr.h"
#include "ace/Reactor.h"
#include "ace/Time_Value.h"

class Handle_data: public ACE_Event_Handler
{
    public:
        Handle_data( ACE_Reactor *r = ACE_Reactor::instance() ):ACE_Event_Handler(r)  {}
        ACE_INT32 open( );
        ACE_INT32 handle_input( ACE_HANDLE = ACE_INVALID_HANDLE );
        ACE_INT32 handle_close( ACE_HANDLE = ACE_INVALID_HANDLE, ACE_Reactor_Mask mask = 0 );

        ACE_HANDLE get_handle( ) const
        {
            return peer_.get_handle();
        }
        ACE_SOCK_Stream &get_peer()
        {
            return peer_;
        }
    private:
        ~Handle_data(){ACE_DEBUG( (LM_DEBUG, "handle data ~dctor .\n") );};
    private:
        ACE_SOCK_Stream  peer_;
};

Handle_Data.cpp

#include "ace/SOCK_Stream.h"
#include "ace/Reactor.h"
#include "ace/Event_Handler.h"
#include "ace/Log_Msg.h"
#include "ace/Timer_Queue.h"
#include "handle_data.h"

ACE_INT32 Handle_data::open( )
{
    ACE_INT32 ret = 0;
    ACE_INET_Addr remote_addr;
    get_peer().get_remote_addr( remote_addr );
    ACE_DEBUG( (LM_DEBUG, "the remote addr is %s\n", remote_addr.get_host_addr())  );

    ret = reactor()->register_handler( this, ACE_Event_Handler::READ_MASK );
    if (ret != -1)
    {
        ACE_DEBUG( (LM_DEBUG, "handle data register ok!\n")  );
    }
    return ret;
}

ACE_INT32 Handle_data::handle_close( ACE_HANDLE , ACE_Reactor_Mask )
{
    get_peer().close();
    ACE_DEBUG( (LM_DEBUG, "handle data close.\n") );
    delete this;
    return 0;
}

ACE_INT32 Handle_data::handle_input( ACE_HANDLE )
{
    ACE_INT8 buf[512] = {0};
    ACE_INT32 len;

    len = get_peer().recv( buf, 500);
    if (len > 0)
    {
        ACE_DEBUG( (LM_DEBUG, "recv data %s, len:%d.\n", buf, len) );
        return 0;
    }
    else if (len == 0)
    {
        ACE_DEBUG( (LM_DEBUG, "recv data len is 0, client exit.\n") );
        return -1;
    }
    else
    {
        ACE_DEBUG( (LM_DEBUG, "recv data error len < 0" ) );
        return -1;
    }
}
时间: 2024-10-25 01:49:02

ACE-Reactor框架的相关文章

ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于Reactor框架的服务器. 首先回顾下Reactor模式和Preactor模式. Reactor模式: Reactor模式实现非常简单,使用同步IO模型,即业务线程处理数据需要主动等待或询问,主要特点是利用epoll监听listen描述符是否有响应,及时将客户连接信息放于一个队列,epoll和队列

使用 ACE 库框架在 UNIX 中开发高性能并发应用

使用 ACE 库框架在 UNIX 中开发高性能并发应用来源:developerWorks 中国 作者:Arpan Sen ACE 开放源码工具包可以帮助开发人员创建健壮的可移植多线程应用程序.本文讨论创建使用 ACE 线程的应用程序的一些方法.Adaptive Communication Environment (ACE) 是一个高性能.开放源码.面向对象的框架和 C++ 类库,它有助于简化网络应用程序的开发.ACE 工具包包括一个操作系统层和一个封装网络 API 的 C++ 外观(facade

POCO库中文编程参考指南(11)如何使用Reactor框架?

1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调. 2 光说不练假把式 PoechantReactorServer 类,基本与 PoechantTCPServer: class PoechantReactorServer: public ServerApplication { public: PoechantServer() {} //: _he

在bootstrap ace样式框架上修改的后台管理型模板

后台管理模板开始用frameset布局,但是有时候会遮挡比如上面导航或者左边导航的二级三级弹出菜单,因为宽度被限制了,所以有时候就用easyui或者ext的,但是样式不好看,然后看到了bootstrap ace的后台管理模板,觉得挺漂亮的,所以拿来修改了下,以前是单页型的页面,每个页面都有导航什么的,现在把导航做成公共的了,然后在顶部添加了tab页,双击tab页关闭当前页面,tab页里的内容能够自适应了,然后顺便排列了下表单,差不多就这样,拿出来共享下,觉得不错的给个赞哈..嘿嘿. 下载地址:h

Java全新高大尚HTML5 bootstrap ace后台框架源码

获取[下载地址]   QQ: 313596790A 代码生成器(开发利器);     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势C 安全权限框架shiro ;  Shiro 是一个用 Java 语言实现的框架,通过

Java全新高大尚HTML5 bootstrap ace后台框架源码springmvc mybatis

获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器 [ 正反双向 (单表.主表.明细表.树形表, 开发利器 ) +快速构建表单 ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 B 集成阿里巴巴数据库连接池druid;   数据库连接池  阿里巴巴的

Linux C++学习之路(转自网络)

Module01 - Linux系统基础 由于本系列课程基于Linux(或UNIX),熟悉Linux操作系统是必要的前提. 该模块的课程包含以下方面的内容: 常用Unix/Linux命令    熟悉文件管理.文本处理.进程管理.网络.系统管理等各个方面大约100个常用的命令.    深入了解bash    了解Linux默认shell: bash 的语法.命令执行.I/O重定向.任务控制等.    正则表达式基础    由于UNIX/Linux中很多强大的文本处理命令如:grep.awk.sed

ACE_Event_Handler:事件响应入口

1:ACE_Event_Handler类 在ACE Reactor框架中,ACE_Event_Handler是所有事件处理器的基类.ACE_Event_Handler提供了一组事件处理的挂钩方法,理解和掌握这些挂钩方法的触发条件和使用方法,是ACE Reactor编程装B道路的重点.先看一下ACE_Event_Handler提供的关键方法: 2:举个栗子 1:A从B那里下了订单,要求B每天送一份货物至A提供的地址.该过程类似于在ACE_Reactor::register_handler()上注册

linux 网络编程需要学习的内容

Linux C++培训发 课程模块 Linux C++全科班课程由以下模块组成: Module01 - Linux系统基础 由于本系列课程基于Linux(或UNIX),熟悉Linux操作系统是必要的前提. 该模块的课程包含以下方面的内容: 常用Unix/Linux命令熟悉文件管理.文本处理.进程管理.网络.系统管理等各个方面大约100个常用的命令. 深入了解bash了解Linux默认shell: bash 的语法.命令执行.I/O重定向.任务控制等. 正则表达式基础由于UNIX/Linux中很多

ACE_Time_Value

为了兼容各个平台的时间特性,ACE Reactor框架提供了ACE_Time_Value类.ACE_Time_Value的关键方法见下图3.2和表3.2.3.3: ACE_Time_Value目的是为了提供一个规范的时间表达格式,比如,规范ACE_Time_Value(1,1000000)的值与ACE_Time_Value(2)的值相等.由于ACE_Time_Value(1,1000000)用法比较简单,本文不再阐述. 读书笔记:C++ Network Programming Volume2 S