反应器组件 ACE_Reactor

6.1 反应器组件 ACE_Reactor

反应器的基本原理是:
 针对关心的某个事件写一个事件处理器(event_handler). 将该事件处理器登记到反应器中(同时指明关心的事件). 
 然后反应器会自动检测事件的发生. 并调用预先登记的事件处理器中的回调函数.
 

所以ACE Reactor 框架的责任:

1、检测来自各种事件源的事件的发生。

2、将事件多路分离给其预先登记的事件处理器。

3、分派给处理器所定义的挂钩方法,从而以一种应用定义的方式处理这些事件。


6.2 事件处理器

在ACE中. 反应器是ACE_Reactor类的单件对象(因为程序中通常只需要一个反应器). 
反应器提供了登记/撤销 事件处理器的接口. register_handler() / remove_handler() .
这些接口要求 事件处理器必须是 ACE_Event_Handler 类型的. 所以我们的事件处理器类必须从该类继承.

在ACE_Event_Handler类中定义了一些类似 "handle_***" 的回调方法. 我们必须在派生类中重写我们敢兴趣的. 
在反应器需要检测某个I/O句柄上是否有事件时. 需要知道原始句柄. 这样就需要重写事件处理器类的get_handle()函数.  
下边是ACE_Event_Handler 中声明的钩子函数:
handle_signal ()  当在反应器上登记的信号发生时. 反应器回调该函数. (不懂)
handle_input ()  当来自I/O设备的输入可用时. 反应器自动回调该方法. 
handle_exception ()  当在反应器上登记的异常事件发生时. (不懂)
handle_timeout () 当在反应器上登记的定时器超时的时候. 回调该方法.
handle_output ()  当在IO设备上的输出可用时. 回调该方法.
6.2.1 登记事件处理器
使用 ACE_Reactor 类的 register_handler() 函数.   这个函数有好几个重载形式.  
该函数有个参数用来指出感兴趣的事件. 它可以是下边一些常量 (定义在ACE_Event_handler类中):
READ_MASK    句柄上有数据可读时   回调 handle_input()
WRITE_MASK    句柄上可写时   回调 handle_output()
TIMER_MASK   回调 handle_close()  不懂怎么用...
ACCEPT_MASK    有来自客户端的新的连接请求时   回调 handle_input()
CONNECT_MASK   建立连接时   回调 handle_input()
DONT_CALL    它用在显式拆除事件处理器的remove_handler()函数中. 表示拆除前不调用 handler_close() 函数.

6.2.2 拆除事件处理器
当不在需要处理某个事件时. 需要把对应的事件处理器从反应器中拆除. 
两种拆除事件处理器的办法:
 一种是隐式的自动拆除. 当事件处理器类中的 handle_*** 方法返回的int 小于0 时. 反应器会自动调用事件处理器
  的Handle_close()方法. 并把事件处理器拆除. 
 另一种是显式拆除. 即调用 ACE_reactor::remove_handler(). 这也会调用事件处理器的handle_close(). 然后拆除.
  不过. 如果你不需要调用handle_close(). 可以给remove_handler()传递参数 ACE_Event_Handler::DONT_CALL .
  具体例子在后边会给出.


我在这里创建了一个简单的Event_handler:

class Event_Handler
{
public:
Event_Handler();
virtual ~Event_Handler();
public:
//! 获取反应器
//! @return 反应器指针
Reactor* reactor();
//! 设置反应器
//! @param reactor 反应器指针
void reactor(Reactor* reactor);
//! 获取通道id
//! @return 通道id
virtual uint32_t get_id() = 0;
//! 获取socket句柄
//! @return socket句柄
virtual SOCKET get_handle() = 0;
//! 处理读
//! @return 处理结果 0:处理正常, -1: 连接被关闭, -2:连接异常
virtual int handle_input() = 0;
//! 处理写
//! @return 处理结果 0:处理正常, -1: 连接被关闭, -2:连接异常
virtual int handle_output() = 0;
//! 连接异常
virtual int handle_exception() = 0;
//! 连接关闭
virtual int handle_close() = 0;
//! 超时
virtual int handle_timeout() = 0;
//! 提交发送任务
//! @param send_task 待发送的任务
virtual int post_packet(Net_Packet *send_packet) = 0;
public:
list_head hashitem;
bool read;
bool write;
bool notify_close;
time_t timeout; //<! 超时的时间, 0表示没有设置超时
private:
//! 反应器
Reactor *m_reactor;
};

然后创建对应的处理类:

//! @class SOCK_Acceptor
//! @brief tcp监听处理类
class SOCK_Acceptor : public Event_Handler{

...

};

//! @class SOCK_Connector
//! @brief tcp连接处理类
class SOCK_Connector : public Event_Handler{

...

};

//! @class SOCK_Stream
//! @brief tcp通道处理类
class SOCK_Stream : public Event_Handl{

...

};


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++(17)--详解const

详解const《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------1.const修饰成员变量 2.const修饰函数参数 3.c…

cppcheck的安装和使用

首先从这里下载linux版本的:http://sourceforge.net/projects/cppcheck/files/cppcheck/ 然后下载对应的版本,解压,之后安装: 编译: g++ -o cppcheck -Ilib cli/*.cpp lib/*.cpp 安装: make install

leetcode24 两两交换链表中的节点

给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 思路&#xff1a;这一看就是个递归定义&…

再议指针和引用的一些事情吧

关于指针和引用一直是学习C++的同学们争论的焦点,什么时候用指针,什么时候用引用,还有怎么引用数组,这么用指针访问数组,以及初始化的问题。 不过有一些文章我在很早就已经写过,但是由于当时时间不充分,自己也都是随性写的,可以参看以前我的一个文章:http://blog.csd…

C++(18)--复制构造函数

复制构造函数《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------包装基本类&#xff0c;封装一些算法。 需求…

lua与C++粘合层框架

一. lua调用C 在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型: typedef int (*lua_CFunction) (lua_State *L);   也就是说, 偶们在C中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, 偶们的lua_State是…

leetcode147 对链表进行插入排序

丢人&#xff0c;我就是按插入排序老老实实写的啊。。。。 别人肯定map了hhh。 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始&#xff0c;该链表可以被认为已经部分排序&#xff08;用黑色表示&#xff09;。 每次迭代时&#xff0c;从输入数据中移除一个…

PaperNotes(13)-Conditional Image Generation with PixelCNN Decoders

conditional Image generation with PixelCNN DecodersICML的best paperpixel cnn 属于完全可见的信念网络&#xff0c;需要对 概率密度 建模。给定图像数据x&#xff0c;想要对概率分布p(x)建模。概率分布p(x)可以看做&#xff0c;每一像素分布同时作用结果的一个联合分布。一…

Expression : invalid operator 解决方法

从技术上说&#xff0c;用于排序关联容器的比较函数必须在它们所比较的对象上定义一个“严格的弱序化(strict weak ordering)”。&#xff08;传给sort等算法的比较函数也有同样的限制&#xff09;,就是两个对象比大小或先后的规则&#xff0c;比如两个 string对象比大小的规则…

leetcode23 合并K个排序链表

合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 思路&#xff1a;把初始的每一个链表当成数组中的一个数&#xff0c;做…

Xcode LaunchImage 载入界面大小设置

iPhone Portrait iOS 8-Retina HD 5.5 (12422208) @3x iPhone Portrait iOS 8-Retina HD 4.7 (7501334) @2x iPhone Portrait iOS 7,8-2x (640960) @2x iPhone Portrait iOS 7,8-Retina 4 (6401136) @2x iPhone Portrait iOS 5,6-1x (320480) @1x iPhone Portrait iO…

leetcode237 删除链表中的节点(你意想不到的做法,注意细节)

请编写一个函数&#xff0c;使其可以删除某个链表中给定的&#xff08;非末尾&#xff09;节点&#xff0c;你将只被给定要求被删除的节点。 现有一个链表 -- head [4,5,1,9]&#xff0c;它可以表示为: 示例 1: 输入: head [4,5,1,9], node 5 输出: [4,1,9] 解释: 给定你链…

cppcheck值得注意的一些筛选项

使用完cppcheck进行C代码检测之后&#xff0c;可能筛选起来很麻烦&#xff0c;一般常见的优化有 emptiness&#xff0c;就是当你使用stl的时候&#xff0c;最好用empty替代size 还有就是 leak

C++(19)--自定义Array,vector练习

自定义Array,vector1.自定义Array2.自定义vector《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------1.自定义…

让cocos2dx支持并通过arm64 编译

为了要支持64位,请把这个文件直接替换到对应的lib目录下,本来是需要改neton_matrix_impl.c里的宏定义, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 为#if defined(_ARM_ARCH_7) 还有 third_party目录下的curl的支持。

springboot——概述

Spring Boot 介绍 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计⽬的是⽤来简化新 Spring 应⽤ 初始搭建以及开发过 程&#xff0c;该框架使⽤了特定的⽅式来进⾏配置&#xff0c;从⽽使开发⼈员不再需要定义样板化的配置。 默认配置了很多框架的使⽤⽅式…

C++(20)--类型自动转换

类型自动转换1.C内置类型转换2.实现自定义类的类型转换《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》 -------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------…

关于遍历linux的文件目录的坑- readdir

去年给公司写了一个配置服务器,目的是解决运维的工作量太大,而且传送服务器需要的配置文件需要脚本传送到各个服(每个服ip不一样,需要scp),然后再刷新通知各个GameServer,中间有没有传送失败并不得知,而且维护相当麻烦,所以我写了这个服务器,所有区服的配置都在这里边…

终于,我读懂了所有Java集合——sort

Collections.sort 事实上Collections.sort方法底层就是调用的Arrays.sort方法&#xff0c;而Arrays.sort使用了两种排序方法&#xff0c;快速排序和优化的归并排序。 快速排序主要是对那些基本类型数据&#xff08;int,short,long等&#xff09;排序&#xff0c; 而归并排序用于…

PRML(1)--绪论(上)多项式曲线拟合、概率论

PRML绪论1.1 多项式曲线拟合1.1.1 问题描述1.1.2 最小化平方和误差1.1.3 多项式阶数确定1.1.4 有趣问题--高阶模型为什么效果不好1.1.4 数据集规模对模型的影响1.1.5 参数正则化缓解过拟合问题1.2 概率论1.2.1离散型随机变量1.2.2 连续型随机变量1.2.3 期望和方差1.2.4 贝叶斯概…