(十五)evbuffers缓冲区(上)

本文介绍了libevent中的evbuffer缓冲区,包括evbuffer结构体、evbuffer_new、evbuffer_add_buffer和evbuffer_add函数的使用。evbuffer_new用于申请缓冲区空间,evbuffer_add_buffer将一个缓冲区接在另一个缓冲区后面,evbuffer_add处理缓冲区数据添加,并可能触发缓冲区扩展。文章还讨论了evbuffer_expand的扩展策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

evbuffer是libevent的缓冲区部分,它主要是负责缓冲区的构建等操作,而bufferevent主要负责管理输入输出缓冲区,相当于是对evbuffer做的一层抽象,缓冲区对于一个网络库几乎是必需的。我们来介绍关于evbuffer部分,部分主要集中在event.hbuffer.c

evbuffer结构体

首先,先了解缓冲区的数据结构:

struct evbuffer {
        u_char *buffer;
        u_char *orig_buffer;
        size_t misalign;
        size_t totallen;
        size_t off;

        void (*cb)(struct evbuffer *, size_t, size_t, void *);
        void *cbarg;
};

buffer:当前有效缓冲区的起始地址
orig_buffer:申请内存时分配的起始地址
misalign:前两者的差值,即buffer相对于orig_buffer的偏移地址
totallen:申请内存的整个大小
off:代表有效数据的长度
cb:当缓冲区有变化时的回调函数
cbarg:回调函数的参数
这里就直接引用网上的一张图来帮助理解。(抱歉,没有找到原文链接,看到的也是转发的)
这里写图片描述
接下来,我们来看看关于缓冲区的一些操作

evbuffer_new

struct evbuffer *
evbuffer_new(void)
{
    struct evbuffer *buffer;

    buffer = calloc(1, sizeof(struct evbuffer));

    return (buffer);
}

这个函数很简单,就是替evbuffer申请空间并返回就完了。evbuffer_free也类似,只是加了一步先释放orig_buffer指向的内存,然后再释放evbuffer,这里为了节约篇幅就不放出来了,如果感兴趣可以看一看。

evbuffer_add_buffer

该函数的作用是将一个缓冲区移接到另一个缓冲区末尾。在正式分析这个函数之前,先介绍一个宏函数SWAP,代码如下:

#define SWAP(x, y) do { \
        (x)->buffer = (y)->buffer; \
        (x)->orig_buffer = (y)->orig_buffer; \
        (x)->misalign = (y)->misa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值