libevent

本文详细介绍了libevent库的特性,特别是event和bufferevent事件的区别,以及如何创建、操作和管理事件。重点讲解了bufferevent的缓冲区回调机制和常见操作,包括事件状态转换和evconnlistener的链接监听。
摘要由CSDN通过智能技术生成

libevent的特性

事件处理框架 event_base
两种事件 event 与 bufferevent
主要区别是bufferevent带缓冲区

libevent的event事件常用操作

1、创建事件处理框架 event_base
struct event_base* event_base_new();
失败返回NULL

2、创建事件
struct event* event_new(struct event_base* base, evutil_socket_t fd, short whar, event_callback_fn cb, void* arg);
参数:
struct event_base* base, //event_base 处理框架
evutil_socket_t fd, //文件描述符
short whar, //事件 一些定义的宏包括 EV_READ, EV_WRITE 等
event_callback_fn cb, //事件发生对应的处理动作
void* arg // 回调函数cb参数

typedef void(* event_callback_fn) (evutil_socket_t , short , void*);

3、将事件添加到处理框架上
int event_add(struct event* ev, const struct timeval* tv );
// tv==NULL 事件被触发,对应的回调才会被调用
//tv 如果设置了时间,则在该时间内事件未被触发,时间到达后,回调函数还是会调用

4、开始事件循环
int event_base_dispatch(struct event_base* base);
函数内部有一个循环 会花很长时间

5、释放资源 (event 与 event_base)
event_free(struct event* event);
event_base_free(struct event_base* base);

6、查看平台上支持的IO转接函数
const char** event_get_supported_methords();
可以看作返回一个char* str[] 数组

7、查看base使用的IO转接函数
const char* event_base_get_methord(const struct event_base *base);

8、重新初始化base
event_reinit();

9、循环停止
如果event_base 正在执行回调,在回调执行完毕后立即退出
int event_base_loopexit(
struct event_base * base,
const struct timeval *tv
);

让event_base 强制立即退出循环
int event_base_loopbreak(struct event_base *base);

libevent内部事件的状态转换

1、非未决:没有资格被处理
2、未决:有资格被处理,但还没有被处理
3、激活:对应的事件被触发
4、被处理:回调函数执行完毕
在这里插入图片描述

libevent的bufferevent事件常用操作

bufferevent理解:
bufferevent是libevent为IO缓冲区操作提供的一种通用机制
bufferevent 由一个底层的传输端口(如套接字)、一个读取缓冲区和一个写入缓冲区组成
与通常的事件在底层传输端口已经就绪,可以读取或者写入的时候执行回调不同的是, bufferevent在读取或者写入了足够量的数据之后,调用用户提供的回调。

回调 - 缓冲区对应的操作
每个bufferevent有两个数据相关的回调
一个读取回调
缓冲区中有数据,读缓冲区对应的回调函数会被调用
一个写入回调
往缓冲区中写数据,数据会被libevent框架发送出去,写回调就会被调用
还有一个事件回调
一共有三个回调

头文件:#include <event2/event.h>

1、创建事件处理框架 event_base
struct event_base* event_base_new();
失败返回NULL

2、创建带缓冲区事件
struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options);
bufferevent没有将事件添加到处理框架event_base上这步操作

3、给缓冲区设置回调函数
void bufferevent_setcb(struct bufferevent *bufev,
bufferevent_data_cb readcb, bufferevent_data_cb writecb,
bufferevent_event_cb eventcb, void *cbarg);
参数:
bufferevent_data_cb readcb //读回调函数
bufferevent_data_cb writecb //写回调函数 不需要使用设置为NULL
bufferevent_event_cb eventcb //事件回调函数,对一些出现的事件进行触发
void *cbarg //回调函数参数

4、设置缓冲区可用
int bufferevent_enable(struct bufferevent *bufev, short event);
默认写缓冲区是可用的,读缓冲区不可用

5、开始事件循环
int event_base_dispatch(struct event_base* base);
函数内部有一个循环 会花很长时间

6、释放资源 (event 与 event_base)
event_free(struct event* event);
event_base_free(struct event_base* base);

7、其他操作
bufferevent_socket_new
bufferevent_setcb
void bufferevent_enable
bufferevent_disable
bufferevent_read
bufferevent_write
bufferevent_free
bufferevent_socket_connect
evconnlistener_new_bind

链接监听器 evconnlistener

1创建监听套接字socket
2绑定bind
3监听listen
4等待并接受连接accept
强大的evconnlistener_new_bind 函数封装了上述四个步骤
当新连接到来 即第四个步骤,自动调用listen_cb 回调函数

struct evconnlistener* listen = NULL;

struct evconnlistener *evconnlistener_new_bind(struct event_base *base , evconnlistener_cb listen_cb , void *ptr , unsigned flags , int backlog , const struct sockaddr *sa, int socklen);
参数:
struct event_base *base //处理框架
evconnlistener_cb listen_cb //新连接到来触发的回调函数
void *ptr // 回调函数参数
unsigned flags
int backlog
const struct sockaddr *addr
int socklen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值