本文地址:http://www.javashuo.com/article/p-npzxkeen-es.htmlsegmentfault
头文件:<event2/buffer.h>
数组
struct evbuffer *evbuffer_new (void); void evbuffer_free (struct evbuffer *buf);
建立/销毁evbuffer服务器
int evbuffer_enable_locking (struct evbuffer *buf, void *lock); void evbuffer_lock (struct evbuffer *buf); void evbuffer_unlock (struct evbuffer *buf);
第一个函数,参数locking传入的参数是一个锁。能够传入NULL,让evbffer自动建立一个锁。网络
size_t evbuffer_get_length (const struct evbuffer *buf); size_t evbuffer_get_continous_space (const struct evbuffer *buf);
第一个函数,获取当前evbuffer的总数据长度。第二个函数,因为数据在evbuffer的内存中并非连续保存的,这里返回第一个chunk的大小。多线程
int evbuffer_add (struct evbuffer *buf, const void *data, size_t data_len); int evbuffer_add_printf (struct evbuffer *buf, const char *fmt); int evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap);
直接往evbuffer的末尾添加数据socket
int evbuffer_expand (struct evbuffer *buf, size_t data_len);
扩展ev_buffer的预申请内存函数
int evbuffer_add_buffer (struct evbuffer *dst, struct evbuffer *src); int evbuffer_rename_buffer (struct evubffer *src, struct evbuffer *dst, size_t data_len);
两个函数都是“move”操做,也就是说会删除src的指定内容。工具
int evbuffer_prepend (struct evbuffer *buf, const void *data, size_t size); int evbuffer_prepend_buffer (struct evbuffer *dst, struct evbuffer *src);
这两个函数是往evbuffer的头部插入数据oop
unsigned char *evbuffer_pullup (struct evbuffer *buf, ev_ssize_t size);
将指定长度的数据存入到evbuffer的第一个chunk中。若是size为-1,则表示所有。学习
int evbuffer_drain (struct evbuffer *buf, size_t len); int evbuffer_remove (struct evbuffer *buf, void *data, size_t data_len);
从evbuffer的头部放走指定长度的数据,第二个函数能够顺带读出来。
不少文件都是一行一行存储的(好比文本),一下函数能够用来一行一行地读取输入(ASCII)。读取以前要指定行尾的格式。
enum evbuffer_eol_style { EVBUFFER_EOL_ANY, // 任意数量的\r和\n EVBUFFER_EOL_CRLF, // \r或者\r\n EVBUFFER_EOL_CRLF_STRICT, // \r\n EVBUFFER_EOL_LF, // \n EVBUFFER_EOL_NUL // \0 }; char *evbuffer_readln (struct evbuffer *buffer, size_t *n_read_out, enum evbuffer_eol_style eol_style);
Evbuffer使用一个结构体来配置搜索功能,其中pos表示position,以下:
struct evbuffer_ptr { ev_ssize_t pos; struct {/* internal fields */} _internal; }; struct evbuffer_ptr evbuffer_search (struct evbuffer *buffer, const char *what, size_t len, const struct evbuffer_ptr *start); struct evbuffer_ptr evbuffer_search_range (struct evbuffer *buffer, const char *what, size_t len, const struct evbuffer_ptr *start, const struct evbuffer_ptr *end); struct evbuffer_ptr evbuffer_search_eol (struct evbuffer_ptr *buffer, struct evbuffer_ptr *start, size_t *eol_len_out, enum evbuffer_eol_style eol_style);
第一个参数是搜索在evbuffer中与“what
”参数相同的数据而且返回。若是参数start不为空,则会从start
中所指定的位置开始搜索。
第二个函数的不一样是指定了一个搜索范围;第三个函数相似于evbuffer_readln
,可是不复制,只是返回结果而已。
enum evbuffer_ptr_how { EVBUFFER_PTR_SET, EVBUFFER_PTR_ADD, }; int evbuffer_ptr_set (struct evbuffer *buffer, struct evbuffer_ptr *pos, size_t position, enum evbuffer_ptr_how how);
修改evbuffer中的evbuffer_ptr。
sruct aevbuffer_iovec { void *iov_base; size_t iov_len; }; int evbuffer_peak (struct evbuffer *buffer, ev_size_t len, struct evbuffer_ptr *start_atm struct evbuffer_iovec *vec_out, int n_vec);
这个函数给予一个struct evbuffer_iovec
数组,而且用n_vec
制定长度,从evbuffer
中获得的具体数据块的信息,这样就能够直接读取了。
若是start_at
非空,则直接从制定的位置读起。
int evbuffer_reserve_space (struct evbuffer *buf, ev_size_t size, struct evbuffer_iovec *vec, int n_vecs); int evbuffer_commit_space (struct evbuffer *buf, struct evbuffer_iovec *vec, int n_vecs);
这个函数与peak相似,不一样的是使用这个组合,能够直接修改evbuffer
里面的值。
若是是多线程的状况下,注意要在reserve
以前加锁、commit
以后解锁。
int evbuffer_write (struct evbuffer *buffer, evutil_socket_t fd); int evbuffer_write_almost (struct evbuffer *buffer, evutil_socket_t fd, ev_ssize_t howmuch); int evubffer_read (struct evbuffer *buffer, evutil_socket_t fd, ev_ssize_t howmuch);
evbuffer_write
等同于evbuffer_write_almost
中的howmuch
参数指定为-1。
struct evbuffer_cb_info { size_t orig_size; size_t n_added; size_t n_deleted; }; typedef void (*evbuffer_cb_func)(struct evbuffer *buffer, const struct evbuffer_cb_info *info, void *arg); struct evbuffer_cb_func; struct evbuffer_cb_func *evbuffer_add_cb (struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg);
当evbuffer
有操做时,会调用callback,返回entry,则能够用来在后续的函数中引用这个callback。
int evbuffer_remove_cb_entry (struct evbuffer *buffer, struct evbuffer_cb_func *ent); int evbuffer_remove_cb (struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg);
这两个函数用于删除callback
int evbuffer_defer_callbacks (struct evbuffer *buffer, struct event_base *base);
Evbuffer的callback也能够放在event loop里面,这两个函数就是将callback进行defer的函数
基于evbuffer常常会有数据复制,可是不少大负荷的服务器要尽可能减小这些操做,此时就须要如下函数:
typedef void (*evbuffer_ref_cleanup_cb) (const void *data, size_t datalen, void *extra); int evbuffer_add_reference (struct evbuffer *outbuf, const void *data, size_t datalen, evbufferref_cleanup_cb cleanupfn, void *extra);
这个函数经过引用想evbuffer添加一段void *数据而且指定其长度。这段数据必须持续保持有效,直到evbuffer调用callback为止。
(不多用,暂略)
int evbuffer_add_buffer_reference (struct evbuffer *outbuf, struct evbuffer *inbuf);
int evbuffer_freeze (struct evbuffer *buf, int at_front); int evbuffer_unfreeze (struct evbuffer *buf, int at_front);
Libevent官方文档学习笔记(1. libevent_core部分)
Libevent官方文档学习笔记(2. bufferevent部分)
Libevent官方文档学习笔记(3. evbuffer部分)(本文)