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. Masonry第三方代码约束

    #import "RootViewController.h" #import "Masonry.h" @interface RootViewController ...

  2. 代码校验工具 SublimeLinter 的安装与使用

    SublimeLinter 是 Sublime 的插件,它的作用是检查代码语法是否有错误,并提示.习惯了 IDE 下写代码的人一定需要一款在 Sublime 上类似的语法检查工具.下面我们开始. 安装 ...

  3. SQL基础概念-指令

    1,MySQL:(structured query  language)用于访问和处理数据库的标准语言      2,什么是 SQL?      SQL 指结构化查询语言      SQL 使我们有能 ...

  4. 微信开发(03)之新建按钮时报错 errcode 40054

    在微信开发新建公众号的按钮时,报错如下: {errcode:40054,errmsg:"invalid sub button url domain"} 经过仔细排查,发现是url地 ...

  5. Linux Shell 04 数字/字符串/文件测试

    一. 数字测试 格式:n1  -op  n2 测试操作op: eq/ne/le/ge/lt/gt    -->    等于/不等于/小于等于/大于等于/小于/大于 1. 数字比较可以使用特殊的( ...

  6. Windows Server 2008 R2安装WAMPSERVER无法启动的解决方法

    其实根本不算什么解决方法,会者不难的事.Windows Server 2008 R2(也包括其他版本的Windows)默认状态下安装WAMPSERVER经常是无法顺利启动WAMPSERVER的,尤其是 ...

  7. Android ImageButton图像灰色边框

    灰色边框,是imageButton空间自带的. 第一种解决方案: android:scaleType="fitXY"//这个代码是:拉伸图片(不按比例)以填充的长宽.所以图像最后最 ...

  8. 纯CSS3制作学生入学档案表单样式代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. phpcms v9 下拉菜单 二级 三级子栏目调用方法

    很多网站的导航栏可以实现下拉二级菜单,三级菜单等效果,今天我们就来分享phpcms v9 支持下拉菜单的方法,可以支持无限子栏目调用,具体写法如下: <ul> {pc:content ac ...

  10. 边工作边刷题:70天一遍leetcode: day 81

    Encode and Decode Strings 要点:题的特点:不是压缩,而是encode为字节流.所以需要找delimiter来分割每个word,但是delimiter可能是字符本身,所以可以用 ...