Libevent官方
学习目标:
掌握libevent封装的框架思想 了解bufferevent特性 掌握bufferevent事件对象创建、销毁。
libevent:
libevent: 是一个用C语言编写的、轻量级的开源高性能事件通知库。
*libevent特点:
- 事件驱动、高性能
- 轻量级、专注于网络
- 跨平台、支持Windows、Linux、Mac OS等
- 支持多种I/O多路复用技术、epoll、poll、dev/poll、select和kqueue等
- 支持I/O、定时器和信号等事件。
*libevent框架:
创建event_base(头文件event2/event.h)
struct event_base *event_base_new(void);
struct event_base *base = event_base_new(void);
创建事件event
struct event *event_new(struct event_base *base,evutil_socket_ fd,short what,event_callback_fn cd,void *arg);
int event_free(struct event *ev);
- 带缓冲区的事件创建 read/write两个缓冲、借助队列。(头文件event2/bufferevent.h)
struct bufferevent *bufferevent_socket_new(struct event_base *base,evutil_socket_ fd enum, bufferevent options options);
void bufferevent_socket_free(struct bufferevent *ev);
void bufferevent_setcb(struct bufferevent *bufev,bufferevent_data_cb readbc,bufferevent_data_cb writecb,bufferevent_cb eventcb,void *cbarg);
typedef void (*bufferevent_data_cb)(struct bufferevent *bev,void *cbarg);
void read_bc(struct bufferevent *bev,void *cbarg){
.........
bufferevent_read();
}
size_t bufferevent_read(struct bufferevent *bev,void *buf,size_t bufsize);
int bufferevent_write(struct bufferevent *bufev,const void *data,size_t size);
void bufferevent_enable(struct bufferevent *bufev,short events);
bufferevent_enable(ev,EV_READ);
int bufferevent_sokcet_connect(struct bufferevent *bev,struct sockaddr *address,int addrlen);
struct evconnlistener *listner
struct evconnlistener *evconnlistener_new_bind(struct event_base *base,evconnlistener_cb cb,void *ptr,unsigned flage,int backlog,const struct sockaddr *sa,int socklen);
void evconnlistener_free(struct evconnlistner *lev);
服务器端libevent创建TCP连接:
- 创建event_base
- 创建bufferevent事件对象,bufferevent_socket_new()
- 使用bufferevent_setcb()函数给bufferevent的read、write、event设置回调函数
- 当监听的事件满足时,read_cb会被调用,在器内部bufferevent_read()读
- 使用evconnlistener_new_bind创建监听服务器,设置其回调函数,当有客户端成功连接时,这个回调函数会被调用
- 封装listener_cb()在函数内部,完成与客户端通信
- 设置读缓冲、写缓冲的使能状态
- 启动循环event_base_dispath()
- 释放连接
将事件添加到base上
int event_add(struct event *ev,const struct timeval *tv);
将事件从base上摘下
int event_del(struct event *ev);
循环监听事件满足
int event_base_dispatch(struct event_base *base);
只有event_new种指定了EV_PERSIST才持续触发,否则只触发一次,就跳出循环
释放event_base
void event_base_free(struct event_base *base);
event_base_free(base);
未决和非为决 未决:有资格被处理,但尚未被处理。 非为决:没有资格被处理 event_new→event→非为决→event_add→未决→dispatch() && 监听事件被触发→激活态→执行回调函数→处理态→非为决event_add && EV_PERSIST→未决→event_del→非为决
|