釋放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;
}