博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libevent+bufferevent总结
阅读量:6622 次
发布时间:2019-06-25

本文共 2363 字,大约阅读时间需要 7 分钟。

libevent+bufferevent总结

1 学习参考网址

libevent学习网址:

bufferevent学习网址:

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

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

 

转载于:https://www.cnblogs.com/bugutian/p/4490908.html

你可能感兴趣的文章
我的Java后端书架 (2016年暮春3.0版)
查看>>
两行代码搞定UITableView无数据无网络显示-b
查看>>
Microsoft Speech SDK开发包 使用
查看>>
Android应用开发基础篇(2)-----Notification(状态栏通知)
查看>>
10 款非常棒的CSS代码格式化工具推荐
查看>>
SQL Server 临时表的删除
查看>>
StackOverFlow关于JVM的文章
查看>>
程序8
查看>>
【原】WebRebuild深圳站的一点感悟
查看>>
23讲 URL
查看>>
Excel Open Xml中CellStyleXfs,cellStyle,cellXfs之间关系的总结
查看>>
QT Basic---Widgets<1>
查看>>
Android开发10.3:UI组件GridView网格视图
查看>>
Power BI的一些视频演示资源
查看>>
Entity Framework 5.0基础系列
查看>>
使用Swift和SpriteKit写一个忍者游戏
查看>>
2014辛星在读CSS第八节 使用背景图片
查看>>
TBluetoothLEDevice.UpdateOnReconnect
查看>>
QtTableView 简介
查看>>
Linux系统上安装软件(ftp服务器)
查看>>