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 {
 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);

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

时间: 2024-12-24 18:11:10

libevent+bufferevent总结的相关文章

服务器libevent bufferevent 初窥

1,最近在学习libevent,记录一下学习过程了,于是简单的一个服务器,回显而已 2,代码 #include <iostream> #include <stdlib.h> #include <event.h> #include <sys/stat.h> #include <string.h> #include <netinet/in.h> #include <sys/socket.h> #include <netd

libevent::bufferevent

#include <cstdio> #include <netinet/in.h> #include <sys/socket.h> #include <fcntl.h> #include <event2/event.h> #include <event2/buffer.h> #include <event2/bufferevent.h> #include <assert.h> #include <unis

libevent学习七(bufferevent)

1. 每个bufferevent 都拥有类型为struct evbuffer的input buffer和out buffer,分别供数据读取和数据写入使用. 2.读取和写入数据是通过编写和设置对应的回调函数进行,而调用回调函数的时机则根据水位是否满足来的,水位又是可以设置的.默认情况下读的低水位是0,就是说libevent从底层读到大于0的数据到input buffer中,读回调函数就会调用,读回调函数读取input buffer的数据:同样默认的写水位也为0,就是说一旦output buffe

Libevent源码分析(六)--- bufferevent

上一节说过,libevent提供六种bufferevent类型,后面会详细分析其中的两个:bufferevent_sock和bufferevent_async.下面是bufferevent的详细定义: struct bufferevent { /** Event base for which this bufferevent was created. */ struct event_base *ev_base; /** Pointer to a table of function pointer

(转)Libevent(4)— Bufferevent

转自:http://name5566.com/4215.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Libevent 为 2.0.21 Buffer IO 模式 bufferevent 提供给我们一种 Buffer IO 模式(这里以写入数据为例): 在我们需要通过某个连接发送数据的时候,先将等待发送的数据放入到一个 buffer 中 等待此连接可以写入数据 尽可能多的获取 buffer 中的数据写入

libevent(九)bufferevent

接上文: libevent(八)bufferevent 在用户的回调函数中,通过bufferevent_read从输入缓冲input中读数据,相应地,通过bufferevent_write向输出缓冲output中写数据. 关于写事件,这里要多说几句. 对于一个fd,只要它的写缓冲区没有满,就会触发写事件.一般情况下,如果不向这个fd发送大量的数据,它的写缓冲区是不会满的. 所以如果一开始就监听写事件,那么写事件会一直被触发. libevent的做法是:当我们确实要写入数据时,才监听写事件. 下面

libevent(十)bufferevent 2

接上文libevent(九)bufferevent 上文主要讲了bufferevent如何监听读事件,那么bufferevent如何监听写事件呢? 对于一个fd,只要它的写缓冲区没有满,就会触发写事件. 一般情况下,如果不向这个fd发送大量的数据,它的写缓冲区是不会满的. 所以,如果一开始就监听写事件,写事件会一直被触发. libevent的做法是: 当我们确实要向fd写入数据时,才监听该fd的写事件. 监听写事件 在用户回调函数中,可以通过 bufferevent_write 向输出缓冲out

libevent粘包分包解决方案:bufferevent + evbuffer

转自:http://blog.sina.com.cn/s/blog_9f1496990102vshz.html 原文:http://www.lvtao.net/c/631.html Libevent介绍 libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制.著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨平台,而且根据libeve

libevent源码分析:bufferevent

struct bufferevent定义在文件bufferevent_struct.h中. 1 /** 2 Shared implementation of a bufferevent. 3 4 This type is exposed only because it was exposed in previous versions, 5 and some people's code may rely on manipulating it. Otherwise, you 6 should rea