釋放buffer所占用的內(nèi)存。
int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf)
移動(dòng)數(shù)據(jù)從一個(gè)evbuffer到另一個(gè)evbuffer。
實(shí)際上還是調(diào)用了evbuffer_add添加數(shù)據(jù)到outbuf中。但會(huì)清除inbuf中的數(shù)據(jù)。
返回值:成功返回0, 失敗返回-1。
int evbuffer_add_printf( struct evbuffer *, const char* fmt,
) 添加一個(gè)格式化的字符串到evbuffer尾部。
u_char *evbuffer_find(struct evbuffer *buffer, const u_char *what, size_t len)
查找緩沖區(qū)中是否存在指定的字符串what。
注意這里使用的是u_char類(lèi)型,說(shuō)明有可能查找的數(shù)據(jù)不是以’\0’結(jié)尾
如果存在返回指向字符串what的指針,沒(méi)有則返回NULL。
int evbuffer_read(struct evbuffer *buf, int fd, int howmuch)
調(diào)用read/recv函數(shù),從文件描述符fd上讀取數(shù)據(jù)到evbuffer中。如果緩沖區(qū)不夠,調(diào)用evbuffer_expand擴(kuò)充緩沖區(qū)。
int evbuffer_write(struct evbuffer *buffer, int fd)
把緩沖區(qū)中的數(shù)據(jù),調(diào)用send/write函數(shù)寫(xiě)入文件描述符fd上, 如果send/write函數(shù)寫(xiě)入的字節(jié)數(shù)大于0,則調(diào)用evbuffer_drain刪除已寫(xiě)的數(shù)據(jù)。
char *evbuffer_readline(struct evbuffer *buffer)
讀取數(shù)據(jù)以"\r\n","\n\r", "\r" 或者 "\n"結(jié)尾。
返回動(dòng)態(tài)分配內(nèi)存,需要調(diào)用者自己使用free來(lái)釋放內(nèi)存。返回一個(gè)以“\0”結(jié)尾的字符串。
void evbuffer_setcb(struct evbuffer *buffer,
void (*cb)(struct evbuffer *, size_t, size_t, void *),
void *cbarg)
設(shè)置回調(diào)函數(shù)。當(dāng)緩沖區(qū)中發(fā)生變化時(shí), 調(diào)用設(shè)置的回調(diào)函數(shù)。
Evbuffer提供的API已經(jīng)全部介紹完畢,接下來(lái)我們通過(guò)一個(gè)實(shí)例進(jìn)一步學(xué)習(xí)如何使用evbuffer, 想要使用evbuffer,系統(tǒng)里必須已經(jīng)安裝了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;
}