libevent+bufferevent总结

1 学习参考网址

libevent学习网址:http://blog.csdn.net/feitianxuxue/article/details/9372535

http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html

http://www.cppblog.com/mysileng/archive/2013/02/04/197719.html

bufferevent学习网址:http://blog.csdn.net/feitianxuxue/article/details/9386843

http://blog.csdn.net/feitianxuxue/article/details/9386843

2 libevent和bufferevent的基础知识

2.1 event_base

struct event_base {
 const struct eventop *evsel;
 void *evbase;
 int event_count; /* 事件总数
*/
 int event_count_active; /* 活跃事件总数
*/

int event_gotterm; /* 设置终止事件循环
*/
 int event_break; /* 设置立即终止事件循环
*/

/* 活跃事件管理
*/
 struct event_list **activequeues; //
指针数组,数组索引是优先级priority
 int nactivequeues;

/* signal处理信息
*/
 struct evsignal_info sig;

struct event_list eventqueue; // 注册的事件列表
 struct timeval event_tv;

struct min_heap timeheap;

struct timeval tv_cache;
};

event_base的结构如下图:

2.2 bufferevent_new()

bufferevent_new(int fd, evbuffercb readcb, evbuffercb
writecb,everrorcb errorcb, void *cbarg)

CDN/CLS代码中bufferevent_new的作用仅仅是将参数初始化。libevent的bufferevent在event的基础上自己维护了一个buffer,它的结构如下:分别有自己的读写事件、读写缓冲区和读写回调函数。

struct bufferevent {

         struct event_base
*ev_base;

 

         struct event ev_read;

         struct event ev_write;

 

         struct evbuffer *input;

         struct evbuffer *output;

 

         struct event_watermark
wm_read;

         struct event_watermark
wm_write;

 

         evbuffercb readcb;

         evbuffercb writecb;

         everrorcb errorcb;

         void *cbarg;

 

         int timeout_read;   /* 单位是秒
*/

         int timeout_write;  /* 单位是秒
*/

 

         short enabled;        /* 事件是否可用*/

};

2.3 event_base_set(struct event_base *base, struct event *ev)

修改structevent事件结构所属的event_base为指定的event_base。Libevnet内置一个全局的event_base结构。多个线程应用中,如果多个线程都需要一个libevent事件循环,需要调用event_base_set修改事件结构基于的event_base。bufferevent_base_set()就是把读写事件分别置为指定值。

2.4 event_base_loopexit(m_pEvbase, &tv);

event_base_loopexit() 让event_base在给定时间之后停止循环。要等到正在做的事件结束时才会返回。

2.5 event_base_loop(m_pEvbase, 0)

int event_base_loop(struct event_base *, int);

等待事件被触发,然后调用它们的回调函数。这是
event_base_dispatch的更灵活版本。默认情况下,这个循环会一直运行,直到没有添加的事件,或者直到调用了event_base_loopbreak()或者evenet_base_loopexit().你可以通过flags参数修改这个行为。

参数1:eb表示event_base结构体。

参数2:flags是EVLOOP_ONCE | EVLOOP_NONBLOCK的组合。

返回值:0表示成功,-1表示发生了错误,1表示没有事件被注册。

EVLOOP_ONCE: 阻塞直到有一个活跃的event,然后执行完活跃事件的回调就退出。

EVLOOP_NONBLOCK : 不阻塞,检查哪个事件准备好,调用优先级最高的那一个,然后退出。

3 使用说明

libevent用到的主要功能的实现需要的主要函数:

event_new();    初始化一个event

event_base_set(); 把event指针指向一个现在要用到的event

event_base_loop()
监听事件,执行回调函数

在代码中的表示如下:

bufferevent_new(sSocketHead.iFD,
cb_Read, cb_Write, cb_Error, (void*)this);

实现了参数的初始化;

bufferevent_base_set(m_pEvbase, pSocketMsg->pBufev);将事件指针指向当前要运行的事件,其实里面是将相应的读写事件的指针指向了需要运行的事件。

event_base_loop(m_pEvbase, 0);

监听事件,执行回调函数。

libevent+bufferevent总结的更多相关文章

  1. libevent::bufferevent

    #include <cstdio> #include <netinet/in.h> #include <sys/socket.h> #include <fcn ...

  2. 一步一步解剖Libevent源代码 - 0

    本系列文章将在<Libevent源码深度解剖>的基础上,结合Libevent-2.0.22代码,更新了其中的一些定义和说明,以及加上了bufferevent部分.   一.Libevent ...

  3. [转载]Parsing X.509 Certificates with OpenSSL and C

    Parsing X.509 Certificates with OpenSSL and C Zakir Durumeric | October 13, 2013 While OpenSSL has b ...

  4. 处理大并发之五 使用libevent利器bufferevent

    转自:http://blog.csdn.net/feitianxuxue/article/details/9386843 处理大并发之五 使用libevent利器bufferevent 首先来翻译一段 ...

  5. libevent源码分析:bufferevent

    struct bufferevent定义在文件bufferevent_struct.h中. /** Shared implementation of a bufferevent. This type ...

  6. (转)Libevent(4)— Bufferevent

    转自:http://name5566.com/4215.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Li ...

  7. Libevent学习笔记(五) 根据例子学习bufferevent

    libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...

  8. Libevent学习笔记(四) bufferevent 的 concepts and basics

    Bufferevents and evbuffers Every bufferevent has an input buffer and an output buffer. These are of ...

  9. libevent学习七(bufferevent)

    1. 每个bufferevent 都拥有类型为struct evbuffer的input buffer和out buffer,分别供数据读取和数据写入使用. 2.读取和写入数据是通过编写和设置对应的回 ...

随机推荐

  1. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...

  2. 再也不用管UIImagePicker的代理了

    EasyImagePicker 闲暇之余对UIImagePicker做了封装,将代理调用的方式封装成block回调的方式,这样一行代码就能够搞定UIImagePicker的使用,包括选择图片,取消选择 ...

  3. linux下安装mysql手记

    安装mysql 下载mysql-standard-4.1.8-pc-linux-i686.tar.gz文件到目录/usr/local/下 # groupadd mysql   //添加mysql用户组 ...

  4. 敏捷软件开发:原则、模式与实践——第14章 使用UML

    第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...

  5. QT添加程序图标及窗口图标

    程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...

  6. php类型转换以及类型转换的判别

    部分摘自PHP: 类型 - Manual 相关链接 PHP 在变量定义中不需要(或不支持)明确的类型定义:变量类型是根据使用该变量的上下文所决定的.也就是说,如果把一个 string 值赋给变量 $v ...

  7. 【ubuntu】中文输入法安装二三事

    本来很愉快地刷着JS程序,很有感慨啊,想写篇博客记一下学习笔记,结果忘记了博客账号,后来通过邮箱找回了之后想要开始写..发现ubuntu的中文输入法不能用啊(其实不是不能用,就是小白没搞清楚状况,双系 ...

  8. MAPR 开发环境搭建过程记录

    我下载了MAPR 官方提供的virtualbox 和 vmware版本的sandbox进行试用. 开始试用了一会vmware版的,因为不太熟悉vmware的操作,而且vmplayer经常没有反应,后来 ...

  9. NOIP2010普及组T3 接水问题 ——S.B.S.

    题目描述 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为 1. 现在有 n 名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从 1到 ...

  10. [转]Javascript中的自执行函数表达式

    [转]Javascript中的自执行函数表达式 本文转载自:http://www.ghugo.com/javascript-auto-run-function/ 以下是正文: Posted on 20 ...