释放buffer所占用的内存。
int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf)
移动数据从一个evbuffer到另一个evbuffer。
实际上还是调用了evbuffer_add添加数据到outbuf中。但会清除inbuf中的数据。
返回值:成功返回0, 失败返回-1。
int evbuffer_add_printf( struct evbuffer *, const char* fmt, ) 添加一个格式化的字符串到evbuffer尾部。
u_char *evbuffer_find(struct evbuffer *buffer, const u_char *what, size_t len)
查找缓冲区中是否存在指定的字符串what。
注意这里使用的是u_char类型,说明有可能查找的数据不是以’\0’结尾
如果存在返回指向字符串what的指针,没有则返回NULL。
int evbuffer_read(struct evbuffer *buf, int fd, int howmuch)
调用read/recv函数,从文件描述符fd上读取数据到evbuffer中。如果缓冲区不够,调用evbuffer_expand扩充缓冲区。
int evbuffer_write(struct evbuffer *buffer, int fd)
把缓冲区中的数据,调用send/write函数写入文件描述符fd上, 如果send/write函数写入的字节数大于0,则调用evbuffer_drain删除已写的数据。
char *evbuffer_readline(struct evbuffer *buffer)
读取数据以"\r\n","\n\r", "\r" 或者 "\n"结尾。
返回动态分配内存,需要调用者自己使用free来释放内存。返回一个以“\0”结尾的字符串。
void evbuffer_setcb(struct evbuffer *buffer,
void (*cb)(struct evbuffer *, size_t, size_t, void *),
void *cbarg)
设置回调函数。当缓冲区中发生变化时, 调用设置的回调函数。
Evbuffer提供的API已经全部介绍完毕,接下来我们通过一个实例进一步学习如何使用evbuffer, 想要使用evbuffer,系统里必须已经安装了libevent。
例子代码如下:evbuffer-test.c
#include <stdio.h>
#include <string.h>
#include <assert.h>
//引入libevent头文件
#include "event.h"
int main(int argc, char** argv)
{
struct evbuffer* buff = NULL;
char c, c2[3] = {0};
buff = evbuffer_new();
assert(buff != NULL);
evbuffer_add(buff, "1", 1);
evbuffer_add(buff, "2", 1);
evbuffer_add(buff, "3", 1);
evbuffer_add_printf(buff, "%d%d", 4, 5);
assert(buff->off == 5);
evbuffer_remove(buff, &c, sizeof(char));
assert(c == '1');
evbuffer_remove(buff, &c, sizeof(char));
assert(c == '2');
evbuffer_remove(buff, &c, sizeof(char));
assert(c == '3');
evbuffer_remove(buff, c2, 2);
assert(strcmp(c2, "45") == 0);
assert(buff->off == 0);
evbuffer_add(buff, "test\r\n", 6);
assert(buff->off == 6);
char* line = evbuffer_readline(buff);
assert(strcmp(line, "test") ==0);
assert(buff->off == 0);
free(line);
evbuffer_free(buff);
printf("ok\n");
return 0;
}