bufferevent
相比于 event
比较高级的事件
bufferevent
有 三个事件
- 当数据从底层的缓冲区 拷贝到应用层缓冲区,触发读回调(事件)
- 当应用层缓冲区写入到底层缓冲区,触发写回调
- 当你的连接 连接与断开,会触发事件回调
总结
- 1个文件描述符
- 2个缓冲区(应用层)
- 3个事件回调
普通event
- 0个缓冲区
- 1个回调, 不管读写,触发的都是一个回调函数
buffevent 常用的 api
1.bufferevent_socket_new
struct bufferevent *bufferevent_socket_new(struct event_base *base,evutil_socket fd,int options
);
bufferevent_socket_new
对已经存在的socekt 创建bufferevent事件,可用于后面讲到的链接监听器中的回调函数中
- base 根节点
- fd 文件描述符
- options bufferevent选项
- BEV_OPT_CLOSE_ON_FREE 释放bufferevent时候,自动关闭底层接口
- BEV_OPT_THREADSAFE 线程安全
2.bufferevent_socket_connect
int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *serv, int socklen);
客户端使用
封装了底层socket和connect接口,将bufferevent和通信的socket进行绑定
- bev 提前初始化好的bufferevent事件
- serv 对端(服务端)的ip端口号和协议的结构指针
- socklen 描述serv的长度
3.viod bufferevent_free
viod bufferevent_free(struct bufferevent *bufev);
释放节点,事件
4.上树并且设置回调
void bufferevent_setcb(struct bufferevent *bufev,bufferevent_data_cb readcb,bufferevent_data_cb writecb,bufferevent_data_cb eventcb,void *cbarg
)
回调函数的原型
typedef void (*bufferevent_data_cb)(struct bufferevent *bev,void *ctx);
typedef void (*bufferevent_event_cb)(struct bufferevent *bev,short what,void *ctx);
# what
# BEV_EVENT_EOF
# BEV_EVENT_ERROR
# BEV_EVENT_TIMEOUT
# BEV_EVENT_CONNECTED
5.将数据写入到bufferevent的缓冲区
int bufferevent_write(struct bufferevent *bufev ,const void *data,size_t size)
6.写的另外一种方法,
int bufferevent_write_buffer(struct bufferevent *bufev,struct evbuffer *buf);
7.读
size_t bufferevent_read(struct bufferevent *bufev,viod *data,size_t size);
8.读
int bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf);
9.设置事件生效
int bufferevent_enable(struct bufferevent *bufev,short event);
10.设置事件不生效
int bufferevent_disable(struct bufferevent *bufev,short event);