(十七)bufferevent的管理

本文深入解析libevent中的bufferevent结构体,重点介绍如何进行自动管理缓冲区,包括创建bufferevent、设置读写水位线、注册事件、调整优先级等功能。通过理解水位线逻辑,掌握 bufferevent 在事件触发及回调过程中的作用。
摘要由CSDN通过智能技术生成

前言

在上节中,我们将evbuffers剩余的内容,比如读/写操作进行了剖析。接下来,我们将对bufferevent进行分析,它主要实现了对缓冲区的自动管理。
在本节中,我们先介绍相关结构体以及一些管理操作,相关代码在evbuffer.c以及event.h文件中。

struct bufferevent

该结构体用于管理bufferevent。定义如下:

struct bufferevent {
    struct event_base *ev_base;   //与缓冲区相关联的event_base

    struct event ev_read;  //缓冲区读事件
    struct event ev_write;  //缓冲区写事件

    struct evbuffer *input;    //输入缓冲区
    struct evbuffer *output;  //输出缓冲区

    struct event_watermark wm_read;  //读水位
    struct event_watermark wm_write; //写水位

    evbuffercb readcb;   //缓冲区读回调函数
    evbuffercb writecb;  //缓冲区写回调函数
    everrorcb errorcb;    //发生错误的回调函数
    void *cbarg;        //回调函数的参数

    int timeout_read;   /* in seconds */
    int timeout_write;  /* in seconds */

    short enabled;  //当前启用的事件/* events that are currently enabled */
};

里面又有一个陌生的结构体,struct event_watermark,它也在event.h中定义:

struct event_watermark {
        size_t low;   //低水位   
        size_t high;  //高水位
}

它之所以可以自动管理缓冲区就是因为水位以及相应回调函数的设置。一共有4个水位,分别是读取低水位、读取高水位、写入低水位、写入高水位,它们的作用分别如下:

  1. 读取低水位:当读取操作使输入缓冲区的数据大小超过或等于该水位时,就会调用回调函数。而读取低水位的默认值是0,所以每一次进行读取操作都会导致回调函数被调用。
  2. 读取高水位:它相当于一个警戒线,当输入缓冲区的数据量达到该水位,则停止数据的读取,直到水位回退。它的默认值是无限。
  3. 写入低水位:写入操作使得输出缓冲区的数据量低于或等于该水位时,会调用相关的回调函数。默认值是0,所以只有当输出缓冲区为空时才会调用回调函数。
  4. 写入高水位:bufferevent没有直接使用这个水位。它在bufferevent用作另外一个bufferevent的底层传输端口时有特殊意义。

接下来了解这些基本信息,我们先来看看初始化操作。

新建一个bufferevent

struct bufferevent *
bufferevent_new(int fd, evbuffercb readcb, evbuffercb writecb,
    everrorcb errorcb, void *cbarg)
{
    struct bufferevent *bufev;
    //申
libeventbufferevent 可以用于收发数据,具体步骤如下: 1. 创建 bufferevent 对象: ``` struct bufferevent *bev; bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); ``` 其中,base 是 event_base 对象,fd 是已连接的 socket 文件描述符,BEV_OPT_CLOSE_ON_FREE 表示在释放 bufferevent 对象时关闭底层的 socket 连接。 2. 设置回调函数: ``` void bev_read_cb(struct bufferevent *bev, void *ctx) { // 处理读事件 } void bev_write_cb(struct bufferevent *bev, void *ctx) { // 处理写事件 } void bev_event_cb(struct bufferevent *bev, short events, void *ctx) { // 处理事件 } bufferevent_setcb(bev, bev_read_cb, bev_write_cb, bev_event_cb, NULL); ``` bufferevent_setcb 函数用于设置 bufferevent 对象的回调函数,包括读、写、事件回调函数。 3. 启用 bufferevent: ``` bufferevent_enable(bev, EV_READ|EV_WRITE); ``` bufferevent_enable 函数用于启用 bufferevent 对象的读写事件。 4. 发送数据: ``` const char *data = "hello, world"; bufferevent_write(bev, data, strlen(data)); ``` bufferevent_write 函数用于向 bufferevent 对象写入数据。 5. 接收数据: ``` void bev_read_cb(struct bufferevent *bev, void *ctx) { char buf[1024]; size_t len = bufferevent_read(bev, buf, sizeof(buf)); // 处理接收到的数据 } ``` bev_read_cb 回调函数中,使用 bufferevent_read 函数从 bufferevent 对象中读取数据。 以上就是 libeventbufferevent 收发数据的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值