libevent学习网址:http://blog.csdn.net/feitianxuxue/article/details/9372535html
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/9386843oop
http://blog.csdn.net/feitianxuxue/article/details/9386843学习
struct event_base { |
event_base的结构以下图:spa
bufferevent_new(int fd, evbuffercb readcb, evbuffercb writecb,everrorcb errorcb, void *cbarg).net
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; /* 事件是否可用*/ }; |
修改structevent事件结构所属的event_base为指定的event_base。Libevnet内置一个全局的event_base结构。多个线程应用中,若是多个线程都须要一个libevent事件循环,须要调用event_base_set修改事件结构基于的event_base。bufferevent_base_set()就是把读写事件分别置为指定值。
event_base_loopexit() 让event_base在给定时间以后中止循环。要等到正在作的事件结束时才会返回。
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 : 不阻塞,检查哪一个事件准备好,调用优先级最高的那一个,而后退出。
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);
监听事件,执行回调函数。