libevent+bufferevent总结
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 { int event_gotterm; /* 设置终止事件循环 /* 活跃事件管理 /* signal处理信息 struct event_list eventqueue; // 注册的事件列表 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
struct event ev_read; struct event ev_write;
struct evbuffer *input; struct evbuffer *output;
struct event_watermark struct event_watermark
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总结的更多相关文章
- libevent::bufferevent
#include <cstdio> #include <netinet/in.h> #include <sys/socket.h> #include <fcn ...
- 一步一步解剖Libevent源代码 - 0
本系列文章将在<Libevent源码深度解剖>的基础上,结合Libevent-2.0.22代码,更新了其中的一些定义和说明,以及加上了bufferevent部分. 一.Libevent ...
- [转载]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 ...
- 处理大并发之五 使用libevent利器bufferevent
转自:http://blog.csdn.net/feitianxuxue/article/details/9386843 处理大并发之五 使用libevent利器bufferevent 首先来翻译一段 ...
- libevent源码分析:bufferevent
struct bufferevent定义在文件bufferevent_struct.h中. /** Shared implementation of a bufferevent. This type ...
- (转)Libevent(4)— Bufferevent
转自:http://name5566.com/4215.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Li ...
- Libevent学习笔记(五) 根据例子学习bufferevent
libevent中提供了一个Hello-world.c 的例子,从这个例子可以学习libevent是如何使用bufferevent的. 这个例子在Sample中 这个例子之前讲解过,这次主要看下buf ...
- Libevent学习笔记(四) bufferevent 的 concepts and basics
Bufferevents and evbuffers Every bufferevent has an input buffer and an output buffer. These are of ...
- libevent学习七(bufferevent)
1. 每个bufferevent 都拥有类型为struct evbuffer的input buffer和out buffer,分别供数据读取和数据写入使用. 2.读取和写入数据是通过编写和设置对应的回 ...
随机推荐
- JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码
一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...
- 再也不用管UIImagePicker的代理了
EasyImagePicker 闲暇之余对UIImagePicker做了封装,将代理调用的方式封装成block回调的方式,这样一行代码就能够搞定UIImagePicker的使用,包括选择图片,取消选择 ...
- linux下安装mysql手记
安装mysql 下载mysql-standard-4.1.8-pc-linux-i686.tar.gz文件到目录/usr/local/下 # groupadd mysql //添加mysql用户组 ...
- 敏捷软件开发:原则、模式与实践——第14章 使用UML
第14章 使用UML 在探索UML的细节之前,我们应该先讲讲何时以及为何使用它.UML的误用和滥用已经对软件项目造成了太多的危害. 14.1 为什么建模 建模就是为了弄清楚某些东西是否可行.当模型比要 ...
- QT添加程序图标及窗口图标
程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...
- php类型转换以及类型转换的判别
部分摘自PHP: 类型 - Manual 相关链接 PHP 在变量定义中不需要(或不支持)明确的类型定义:变量类型是根据使用该变量的上下文所决定的.也就是说,如果把一个 string 值赋给变量 $v ...
- 【ubuntu】中文输入法安装二三事
本来很愉快地刷着JS程序,很有感慨啊,想写篇博客记一下学习笔记,结果忘记了博客账号,后来通过邮箱找回了之后想要开始写..发现ubuntu的中文输入法不能用啊(其实不是不能用,就是小白没搞清楚状况,双系 ...
- MAPR 开发环境搭建过程记录
我下载了MAPR 官方提供的virtualbox 和 vmware版本的sandbox进行试用. 开始试用了一会vmware版的,因为不太熟悉vmware的操作,而且vmplayer经常没有反应,后来 ...
- NOIP2010普及组T3 接水问题 ——S.B.S.
题目描述 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为 1. 现在有 n 名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从 1到 ...
- [转]Javascript中的自执行函数表达式
[转]Javascript中的自执行函数表达式 本文转载自:http://www.ghugo.com/javascript-auto-run-function/ 以下是正文: Posted on 20 ...