上一篇我们封装了三种事件监听方式,如果分别提供给客户端使用,有点不方便,也不利于统一管理;我们再封装一层EventLoop。

/***************************************************************************************
****************************************************************************************
* FILE      : event_loop.h
* Description   : 
*             
* Copyright (c) 2012 by Liu Yanyun(E-mail:liuyun827@foxmail.com). All Rights Reserved.
*            Without permission, shall not be used for any commercial purpose

* History:
* Version       Name            Date            Description
   0.1      Liu Yanyun      2012/12/20      Initial Version
   
****************************************************************************************
****************************************************************************************/ 
 
 
#ifndef _EVENT_LOOP_H_  
#define _EVENT_LOOP_H_  
 
#include <string.h>  
#include <stdint.h>  
#include <sys/select.h>  
#include <sys/time.h>  
#include <sys/types.h>  
#include <sys/epoll.h>  
#include <unistd.h>  
#include <poll.h>  
#include "sock_ev.h"  
 
class Socket; 
class EventDispatcher; 
 
 
/*==================================================================
* Function  : EventLoop
* Description   : event loop,it is adapter for select poll epoll wait event
==================================================================*/ 
class EventLoop 

public: 
 
  /*==================================================================
  * Function    : EventLoop.EventLoop
  * Description : construction function
  ==================================================================*/ 
  EventLoop(); 
 
  /*==================================================================
  * Function    : EventLoop.~EventLoop
  * Description : Destructor function
  ==================================================================*/ 
  virtual ~EventLoop(); 
 
  /*==================================================================
  * Function    : EventLoop.initialize
  * Description : initialize the loop
  * Input Para  : type_--dispatcher type
  * Return Value: success return true,or else return false
  ==================================================================*/ 
  bool initialize(LoopType type_); 
 
  /*==================================================================
  * Function    : EventLoop.addEvt
  * Description : add an event and register callback
  * Input Para  : 
  * Output Para : 
  * Return Value: success return true,or else return false
  ==================================================================*/ 
  bool addEvt(Socket *sock_, 
      EvCallBack cb_, 
      EventType evt_, 
      void *arg_); 
 
  /*==================================================================
  * Function    : EventLoop.removeEvt
  * Description : remove an event and un-register callback
  * Input Para  : 
  * Output Para : 
  * Return Value: success return true,or else return false
  ==================================================================*/ 
  bool removeEvt(Socket *sock_, 
      EventType evt_); 
 
  /*==================================================================
  * Function    : EventLoop.listen
  * Description : wait for event trigger
  * Input Para  : 
  * Output Para : 
  * Return Value: 
  ==================================================================*/ 
  int listen(int timeout_); 
       
private: 
 
    EventDispatcher *dispatcher; 
    SockMapT  sockMap; 
}; 
 
#endif /*_EVENT_LOOP_H_*/

/***************************************************************************************
****************************************************************************************
* FILE      : event_loop.cpp
* Description   : 
*             
* Copyright (c) 2012 by Liu Yanyun(E-mail:liuyun827@foxmail.com). All Rights Reserved.
*            Without permission, shall not be used for any commercial purpose

* History:
* Version       Name            Date            Description
   0.1      Liu Yanyun      2012/12/20      Initial Version
   
****************************************************************************************
****************************************************************************************/

#include "event_loop.h"  
#include "sock_ev.h"  
#include "event_dispatcher.h"  
#include "socket_base.h"  
#include "socket.h"  
 
 
EventLoop::EventLoop() 

  dispatcher = NULL; 

EventLoop::~EventLoop() 

  if(NULL != dispatcher) delete dispatcher; 
 
  sockMap.clear(); 

bool EventLoop::initialize(LoopType type_) 

  if(selectLoop == type_) 
  { 
    dispatcher = new SelectDispatcher(); 
  } 
  else if(pollLoop == type_) 
  { 
    dispatcher = new PollDispatcher(); 
  } 
  else if(epollLoop == type_) 
  { 
    dispatcher = new EpollDispatcher(); 
  } 
  else 
  { 
    logTrace("loop type is not right:%d", type_); 
    return false; 
  } 
 
  if(NULL == dispatcher) 
  { 
    logTrace("new EventDispatcher is failed"); 
    return false; 
  } 
 
  if(!dispatcher->initialize()) 
  { 
    logTrace("dispatcher->initialize() is failed"); 
    return false; 
  } 
 
  return true; 

bool EventLoop::addEvt(Socket *sock_, 
    EvCallBack cb_, 
    EventType evt_, 
    void *arg_) 

  if((NULL == sock_) || (-1 == sock_->getFd()) || (NULL == cb_)) 
  { 
    logTrace("addEvt input is not valid,pleace check"); 
    return false; 
  } 
 
  if(!dispatcher->addEvt(this, sock_, cb_, evt_, arg_)) 
  { 
    logTrace("addEvt event to loop is failed"); 
    return false; 
  } 
 
  sockMap[sock_->getFd()] = sock_; 
 
  return true; 

bool EventLoop::removeEvt(Socket *sock_, 
    EventType evt_) 

  if((NULL == sock_) || (-1 == sock_->getFd())) 
  { 
    logTrace("removeEvt input is not valid,pleace check"); 
    return false; 
  } 
 
  dispatcher->removeEvt(sock_, evt_); 
 
  EventType evt = sock_->getEvt(); 
  if(0 == evt) 
  { 
    sockMap.erase(sock_->getFd()); 
  } 
 
  return true; 

int EventLoop::listen(int timeout_) 

  while(1) 
  { 
    dispatcher->listen(sockMap, timeout_); 
  } 

主要调用前一篇中封装的三种事件监听方式,在初始化的时候选择一种event dipatcher,这就是面向接口编程的好处,利用多态,可以很方便的在运行时进行行为的改变。成员变量sockMap用于保存注册到EventLoop中的socket。

转:sock_ev——linux平台socket事件框架(event loop) .的更多相关文章

  1. 转:sock_ev——linux平台socket事件框架(event dispatcher) .

    最近比较忙,好久没更新了:今天我们看一下事件的监听方式,在linux下面事件的监听方式有三种select.poll.epoll,性能上面epoll最高,如果仅是最多监听十多个描述符,用啥无所谓,如果是 ...

  2. 转:sock_ev——linux平台socket事件框架(socket API的封装) .

    把linux平台提供的有关socket操作的API进行封装是有必要的:基于stream操作的流程与基于dgram操作的流程略有不同,分别放在两个类中,但两者又有很多相似的操作,因此写一个基类,让其继承 ...

  3. 转:sock_ev——linux平台socket事件框架(基于字节流的测试程序) .

    原文:http://blog.csdn.net/gdutliuyun827/article/details/8257186 由于工作与学习的需要,写了一个socket的事件处理框架,在公司写的已经使用 ...

  4. 转:sock_ev——linux平台socket事件框架(socket代理类) .

    前面分析了对socket基本操作的封装,并按照数据的传送方式写了两个类,本篇将写一个代理类提供给库的使用者使用的类. /**************************************** ...

  5. 转:sock_ev——linux平台socket事件框架(uri地址的解析) .

    在第一篇中,已经说明,传递的socket地址采取以下形式: [cpp] view plaincopyprint?stream://192.168.2.10:8080   dgram://192.168 ...

  6. 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .

    上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...

  7. 转:sock_ev——linux平台socket事件框架(logTrace) .

    写代码要有调试log,采用syslog的输出:一般会输出到"/var/log/messages" /**************************************** ...

  8. 简单了解一下事件循环(Event Loop)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  9. JS事件循环(Event Loop)机制

    前言 众所周知,为了与浏览器进行交互,Javascript是一门非阻塞单线程脚本语言. 为何单线程? 因为如果在DOM操作中,有两个线程一个添加节点,一个删除节点,浏览器并不知道以哪个为准,所以只能选 ...

随机推荐

  1. noip200807传纸条

    试题描述: 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的 ...

  2. ThinkPHP -- 基础入门

      ThinkPHP文件结构说明: |——ThinkPHP.php    框架入口文件    |——Common            框架公共文件目录    |——Conf              ...

  3. Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟

    A. Gabriel and Caterpillar 题目连接: http://www.codeforces.com/contest/652/problem/A Description The 9-t ...

  4. CROC 2016 - Elimination Round (Rated Unofficial Edition) E. Intellectual Inquiry 贪心 构造 dp

    E. Intellectual Inquiry 题目连接: http://www.codeforces.com/contest/655/problem/E Description After gett ...

  5. PAT甲级1033. To Fill or Not to Fill

    PAT甲级1033. To Fill or Not to Fill 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...

  6. 线性稳压器 (LDO)

    线性稳压器 (LDO) 当输出电压低于输入电压时,必须从负载电源和压降比来考虑要采用线性稳压器 (LDO) 或降压转换器 (Buck) 低压降线性稳压器 (LDO) 适合用在需求低噪讯.低电流和低压降 ...

  7. jQuery EasyUI 数据网格 - 条件设置行背景颜色

    $('#tt').datagrid({ rowStyler:function(index,row){ if (row.listprice>50){ return 'color:blue;font ...

  8. ORDER BY,GROUP BY 和DI STI NCT 优化

    读<MySQL性能调优与架构设计>笔记之ORDER BY,GROUP BY 和DI STI NCT 优化 2015年01月18日 18:51:31 lihuayong 阅读数:2593 标 ...

  9. .aspx(或.asp)文件与.html(.htm)文件的区别与联系

    由于都是用于描述网页文档的文件,自学asp.net起就对两者之间的关系很好奇 主要的区别在于,当用户请求页面时,它们在服务器的端的处理不同 下图解释客户端请求页面时,服务器端的处理流程: .html文 ...

  10. java中 HashMap和Hashtable,list、set和map 的区别

    摘自: http://blog.chinaunix.net/uid-7374279-id-2057584.html HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Ma ...