目录
1、事件处理框架
//头文件
#include <event2/event.h>
//创建一个事件处理框架
struct event_base * event_base_new(void)
//释放一个事件处理框架
//参数: event_base_free(struct event_base *base)
void event_base_free(struct event_base *base);
//查看底层支持的IO转换模型
const char** event_get_supported_methods(void)
//查看当前实际处理框架使用的IO转接模型
const char *event_base_get_method(const struct event_base *base);
2、设置事件循环
//头文件
#include <event2/event.h>
//启动事件处理框架中的事件循环
//参数: event_base_new() 的返回值
/*
事件检测过程中的特点
举例: 检测读事件
-如果对方没有发送数据过来,会一直持续检测,等待事件被触发
-检测到有读事件,默认情况下只会被处理一次,事件循环就停止了,只能接受一次数据
-如果要持续的接收数据,需要额外设置
*/
//这个函数被调用,内部会进行事件检测,代码阻塞在这一行
int event_base_dispatch(struct event_base *base);
3、终止事件循环
//头文件
#include <event2/event.h>
//表示一个时间段,tv_sec+tv_usec
struct timeval{
long tv_sec;
long tv_usec; //微秒
};
//假设事件循环正在继续,并且在处理一个实际纪有效的事件,代用这个函数终止事件循环
//事件循环不会马上终止,在tv指定的时长之后,事件就被终止了
int event_base_loopexit(struct event_base *base,const struct timeval *tv);
参数:
-base:事件处理框架
-tv: 在指定的时间段之后,退出事件循环
//马上终止事件循环
int event_base_loopbreak(struct event_base *base);
4、事件的创建与释放
//头文件
#include <event2/event.h>
#define EV_TIMEOUT 0x01 //定时器超时
#define EV_READ 0x02 //读,检测读缓冲区是否有数据
#define EV_WRITE 0x04 //写,检测写缓冲区是否可写
#define EV_SIGNAL 0x08 //信号
#define EV_PERSIST 0x10 //设置事件被重复检测
#define EV_ET 0x20 //边沿模式
typedef void (*event_callback_fn)(evutil_socket_t fd, short what,void *arg);
参数:
-fd: 文件描述符,是event_new()第二个参数
-what: 记录了实际文件描述符触发的事件
-arg: event_new()的最后一个参数
//创建一个需要检测的事件,struct event 就是创建出的事件
//evutil_socket_t == int
//event_new()函数的本质就是对一个文件描述符进行封装
struct event* event_new(struct evnet_base *base, evutil_socket_t fd,
short what, event_callback_fn cb, void *arg);
参数:
-base:事件处理框架
-fd: 一个文件描述符,比如管道的文件描述符,套接字通信的文件描述符
-what:要检测的事件,检测第二个参数fd的事件
-EV_READ: 读事件
-EV_WRITE:写事件
-EV_SIGNAL:信号事件(linux)
-EV_ET: 设置边沿模式
-cb:函数指针对应一个回调函数,当检测的事件被触发,这个函数就被调用
-arg: 作为实参传递给回调函数cb
void event_free(struct event *event);
5、事件的添加和删除
struct timeval{
long tv_sec; //秒
long tv_usec; //微秒
};
//事件被创建之后,不能被事件处理框架直接检测,需要做添加处理
int event_add(struct event *ev, const struct timeval *tv)
参数:
-ev: 通过 event_new() 创建得到的事件
-tv: 超时时长,如果不用指定为NULL
-检测了一个事件,并且在tv指定的时间段中没有被触发,这个事件对应的回调函数会被强制调用
-如果指定为NULL,事件不触发,对应的回调函数就不被调用
//被检测的事件从事件处理框架上删除
int event_del(struct event *ev);