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. LeetCode 7 Reverse Integer(反转数字)

    题目来源:https://leetcode.com/problems/reverse-integer/ Reverse digits of an integer. Example1: x = 123, ...

  2. win+Nginx+php+mysql 环境配置

     1.准备工作 (1)PHP 版本5.6.17 下载地址  PHP官网 (2)Nginx 版本1.8.0 下载地址  Nginx官网 (3)MySQL 版本5.7.10 MySQL官网 2.php的安 ...

  3. python操作db2和mysql ,ibm_db

    我需要提取mysql和db2的数据进行对比,所以需要用python对其都进行操作. python对mysql进行操作应该没什么问题,就是安装drive后就可以了,在上一篇中有讲安装python-mys ...

  4. 5+ App开发入门指南

    HTML5 Plus应用概述 HTML5 Plus移动App,简称5+App,是一种基于HTML.JS.CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实 ...

  5. JavaScript Patterns 4.5 Immediate Functions

    The immediate function pattern is a syntax that enables you to execute a function as soon as it is d ...

  6. 软件测试Lab2

    1.本次上机实验任务:使用webDriver完后自动化测试 2.本次上机实验目的:掌握webDriver的用法和配置. 3.本次上机实验内容: 3.1Selenium的安装: 首先我们上Seleniu ...

  7. 更改ubuntu下mysql的密码

    1.首先,进入环境中去,即 mysql  -u  root  -p   ,然后输入原始密码 2.此时会出现 mysql > 3.开始修改密码: mysql >   use  mysql ; ...

  8. RTB交接

    RTB产品测试进度 元数RTB产品 元数的产品已经测过两个版本,分别是1.1版本和1.2版本,目前线上跑的是1.2版本.程序线上情况目前正常,没有问题. 元数功能账号为:yuanshu  需用root ...

  9. xcode 自定义include路径

  10. spark Basic code demo

    spark-shell --master=spark://namenode01:7077 --executor-memory 2g --driver-class-path /app/spark141/ ...