转:sock_ev——linux平台socket事件框架(event loop) .
上一篇我们封装了三种事件监听方式,如果分别提供给客户端使用,有点不方便,也不利于统一管理;我们再封装一层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) .的更多相关文章
- 转:sock_ev——linux平台socket事件框架(event dispatcher) .
最近比较忙,好久没更新了:今天我们看一下事件的监听方式,在linux下面事件的监听方式有三种select.poll.epoll,性能上面epoll最高,如果仅是最多监听十多个描述符,用啥无所谓,如果是 ...
- 转:sock_ev——linux平台socket事件框架(socket API的封装) .
把linux平台提供的有关socket操作的API进行封装是有必要的:基于stream操作的流程与基于dgram操作的流程略有不同,分别放在两个类中,但两者又有很多相似的操作,因此写一个基类,让其继承 ...
- 转:sock_ev——linux平台socket事件框架(基于字节流的测试程序) .
原文:http://blog.csdn.net/gdutliuyun827/article/details/8257186 由于工作与学习的需要,写了一个socket的事件处理框架,在公司写的已经使用 ...
- 转:sock_ev——linux平台socket事件框架(socket代理类) .
前面分析了对socket基本操作的封装,并按照数据的传送方式写了两个类,本篇将写一个代理类提供给库的使用者使用的类. /**************************************** ...
- 转:sock_ev——linux平台socket事件框架(uri地址的解析) .
在第一篇中,已经说明,传递的socket地址采取以下形式: [cpp] view plaincopyprint?stream://192.168.2.10:8080 dgram://192.168 ...
- 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .
上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...
- 转:sock_ev——linux平台socket事件框架(logTrace) .
写代码要有调试log,采用syslog的输出:一般会输出到"/var/log/messages" /**************************************** ...
- 简单了解一下事件循环(Event Loop)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- JS事件循环(Event Loop)机制
前言 众所周知,为了与浏览器进行交互,Javascript是一门非阻塞单线程脚本语言. 为何单线程? 因为如果在DOM操作中,有两个线程一个添加节点,一个删除节点,浏览器并不知道以哪个为准,所以只能选 ...
随机推荐
- Vue组件深入了解(组件注册和Prop)
一.组件名 自定义组件的名称强烈推荐遵循W3C规范中的方式:字母全小写且必须包含一个连字符. 二.全局注册和局部注册的区别 全局注册 Vue.component进行注册.全局注册的可以在任何创建的实例 ...
- noip2013 车站分级
题目描述 一条单向的铁路线上,依次有编号为 1, 2, …, n1,2,…,n的 nn个火车站.每个火车站都有一个级别,最低为 11 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟 ...
- 如何测试Nginx的高性能
简介 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器: 作为一款轻量级的Web服务器,具有占有内存少, ...
- HTML、XML、XHTML 有什么区别?
HTML即是超文本标记语言(Hyper Text Markup Language),是最早写网页的语言,但是由于时间早,规范不是很好,大小写混写且编码不规范,是语法较为松散的.不严格的Web语言 XH ...
- 搭建简单Ext
一.EXT是什么? 1. Ext是一个Ajax框架,可以用来开发带有华丽外观的富客户端应用,使得我们的b/s应用更加具有活力及生命力,提高用户体验: 2. Ext是一个用javascript编写,与后 ...
- 【JSP EL】EL表达式里日期按照格式显示
转:http://blog.csdn.net/kaishuaige/article/details/8505174 JSP页面用EL表达式 输出date格式 1.头上引入标签 <%@ t ...
- 第六篇 ANDROID窗口系统机制之显示机制
第六篇 ANDROID窗口系统机制之显示机制 ANDROID的显示系统是整个框架中最复杂的系统之一,涉及包括窗口管理服务.VIEW视图系统.SurfaceFlinger本地服务.硬件加速等.窗口管理服 ...
- 关于如何在你的Web项目中实现对空间数据访问权限的控制(一)
Wednesday, 23 JUNE 近来一直在研究关于如何在我的WebGIS项目中实现对空间数据(已发布在GeoServer上)进行权限管理的问题.虽然到目前为止没能找到一个完美的解决方案,但通过这 ...
- Flink 靠什么征服饿了么工程师?
Flink 靠什么征服饿了么工程师? 2018-08-13 易伟平 阿里妹导读:本文将为大家展示饿了么大数据平台在实时计算方面所做的工作,以及计算引擎的演变之路,你可以借此了解Storm.Spa ...
- 2 cocos2dx 3.0 源码分析-Director
Director 导演类, 这个类在整个引擎中担当着最重要的角色, 先看看它是如何初始化的,它共管理了哪些内容呢? 1初始化- 更新处理Scheduler Scheduler 这个类负责用户 ...