1.作用
轻量级 网络io库,封装底层的select poll epoll。
2.三步
1.初始化libevent实例
2.创建事件(fd,EV_READ,fun),并添加到libevent实例中
3.事件循环
3.特点
- 跨平台支持
- 统一事件源
- 线程安全
- 基于Reactor模式的实现
4.模型
1.定义一个实例,2.注册事件(描述符、事件类型、回调函数),3.调用接口启动事件循环,本质就是后端框架会有I/O函数帮我们检测我们关心的文件描述符上有没有数据,如果有数据产生,就通知libevent调用回调函数处理。
当出现:1、(libevent处理的三类事件:I/O事件,信号,定时器)这三个上边都没有可关注的描述符;2、事件处理完成 ;则事件循环会 主动退出。
实例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <event.h>
void sig_fun(int fd,short ev , void* arg)
{
printf("sig =%d\n",fd);
}
void timeout_cd(int fd,short ev ,void*arg)
{
printf("time out\n");
}
int main()
{
//初始化libevent实例
struct event_base * base = event_init();
assert(base != NULL);
//创建信号事件处理器
//struct event* sig_ev = evsignal_new(base,SIGINT,sig_fun,NULL);
struct event* sig_ev = evsignal_new(base,SIGINT,EV_SIGNAL,sig_fun,NULL);
assert(sig_ev != NULL);
event_add(sig_ev,NULL);
//定时事件处理器
//struct event *time_ev = evtimer_new(base,timeout,cb,NULL);
struct event *time_ev = evtimer_new(base,-1,EV_TIMEOUT,timeout,cb,NULL);
assert(time_ev != NULL);
//时间5秒中
struct timeval tv = {5,0};
event_add(time_ev,&tv);
//事件循环,检测那些描述符有事件发生
event_base_dispatch(base);
event_free(time_ev);
event_free(sig_ev);
event_base_free(base);
}
//base:新创建的事件处理器从属Reactor。
//fd:与该事件处理器关联的句柄。创建IO事件处理器时,应该给fd参数传递文件描述符值
//创建信号事件处理器时,应该给fd参数传递信号值
5.libevent支持的事件类型
6.Linux下libevent主要API介绍
创建事件集
struct event_base *event_base_new(void)
创建事件
struct event event_new(struct event_base ,evutil_socket_t ,short ,event_callback_fn,void*)
参数一:事件所在的事件集。
参数二:socket的描述符。
参数三:事件类型,其中EV_READ表示等待读事件发生,EV_WRITE表示写事件发生,EV_SIGNAL表示需要等待事件的号码,如 果不包含上述的标志,就是超时事件或者手动激活的事件。
参数四:事件发生时需要调用的回调函数。
参数五:回调函数的参数值。
添加事件和删除事件
int event_add(struct event * ev,const struct timeval* timeout)
参数一:需要添加的事件
参数二:事件的最大等待事件,如果是NULL的话,就是永久等待
int event_del(struct event *)
参数一:需要删除的事件
分配监听事件
int event_base_dispatch(struct event_base * )
参数:需要监视的事件集
I/O buffer事件
struct bufferevent* bufferevent_socket_new(struct event_base * base,evutil_socket_t fd,int options)
参数一:需要添加到的时间集
参数二:相关的文件描述符
参数三:0或者是相应的BEV_OPT_*可选标志
int bufferevent_enable(struct bufferevent * bev,short event)
参数一:需要启用的bufferevent
参数二:any combination of EV|READ | EV_WRITE
int bufferevent_disable(struct bufferevent * bev,short event)
参数说明:同上
size_t bufferevent_read(struct bufferevent bev,void data,size_t size)
参数一:读取的buffer_event事件
参数二:存储数据的指针
参数三:数据buffer的大小
返回值:读取数据的字节数
int bufferevent_write(struct bufferevent bev,const void data,size_t size)
参数一:读取的buffer_event事件
参数二:存储数据的指针
参数三:要写入的数据的大小,字节数
更多:https://blog.csdn.net/MonroeD/article/details/71910967
7.客户端与服务器端通过libevent链接
代码在这:https://blog.csdn.net/Aspiration_1314/article/details/83663072