前言
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