Libevent的bufferevent事件(三)

发布时间 2023-12-05 20:11:28作者: TechNomad

一、什么是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的选项
  1. BEV_OPT_CLOSE_ON_FREE:释放bufferevent自动关闭底层接口
  2. 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,事件回调将不会被触发。