一、什么是bufferevent事件
bufferevent实际上也是一个event,只不过比普通的event高级一些,它的内部有两个缓冲区,以及一个文件描述符(网络套接字)。我们都知道一个网络套接字有读和写两个缓冲区,bufferevent同样也带有两个缓冲区,还有就是libevent事件驱动的核心回调函数,那么四个缓冲区以及触发回调的关系如下所示:
有三个回调函数:
- 读回调:当bufferevent将底层读缓冲区的数据读到自身的读缓冲区时触发读事件回调
- 写回调:当bufferevent将自身写缓冲区的数据写到底层写缓冲区的时候触发写事件回调
- 事件回调:当bufferevent绑定的socket连接,断开或者异常的时候触发事件回调
二、主要使用的函数
1.bufferevent_socket_new函数
struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options);
bufferevent_socket_new对已经存在的socket创建bufferevent事件,参数说明:
- base:对应根节点
- fd:文件描述符
- options:bufferevent的选项
- BEV_OPT_CLOSE_ON_FREE:释放bufferevent自动关闭底层接口
- BEV_OPT_THREADSTAFE:使bufferevent能够在多线程下是安全的
2.bufferevent_socket_connect函数
int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *serv, int socklen);
bufferevent_socket_connect封装了底层的socket与connect接口,通过调用此函数,可以将bufferevent事件与通信的socket进行绑定,参数如下:
- bev:需要提前初始化的bufferevent事件
- serv:对端的ip地址,端口,协议的结构指针
- socklen:描述serv的长度
3.bufferevent_free函数
void bufferevent_free(struct bufferevent *bufev);
释放bufferevent
4. bufferevent_setcb函数
void bufferevent_setcb(struct bufferevent *bufev, bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg);
bufferevent_setcb用于设置bufferevent的回调函数,readcb,writecb,eventcb分别对应了读回调,写回调,事件回调,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_write函数
int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size);
bufferevent_write是将data的数据写到bufferevent的写缓冲区。
6.bufferevent_write_buffer函数
int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf);
bufferevent_write_buffer 是将数据写到写缓冲区另外一个写法,实际上bufferevent的内部的两个缓冲区结构就是struct evbuffer。
7.bufferevent_read函数
size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);
bufferevent_read 是将bufferevent的读缓冲区数据读到data中,同时将读到的数据从bufferevent的读缓冲清除。
8.bufferevent_read_buffer函数
int bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf);
bufferevent_read_buffer 将bufferevent读缓冲数据读到buf中,接口的另外一种。
9.bufferevent_enable和bufferevent_disable函数
int bufferevent_enable(struct bufferevent *bufev, short event); int bufferevent_disable(struct bufferevent *bufev, short event);
bufferevent_enable与bufferevent_disable是设置事件是否生效,如果设置为disable,事件回调将不会被触发。
标签:struct,bufferevent,函数,事件,Libevent,缓冲区,回调,socket From: https://www.cnblogs.com/TechNomad/p/17878074.html