前言
evbuffer是libevent的缓冲区部分,它主要是负责缓冲区的构建等操作,而bufferevent主要负责管理输入输出缓冲区,相当于是对evbuffer做的一层抽象,缓冲区对于一个网络库几乎是必需的。我们来介绍关于evbuffer部分,部分主要集中在event.h和buffer.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
libevent的evbuffers缓冲区详解

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

被折叠的 条评论
为什么被折叠?



