在寫 Nonblocking Network Program 通常要處理 Buffering 的問題,但並不好寫,主要是因為
read() 或 recv() 不保證可以一次讀到一行的份量進來。在 libevent 裡面提供相當不錯的 Buffer Library 可以用,完整的說明在
man event 的時候可以看到,最常用的應該就是以 evbuffer_add()、evbuffer_readline() 這兩個 Function,其他的知道存在就可以了,需要的時候再去看詳細的用法。下面直接提供
libevent-buff.c 當作範例,編譯後看執行結果,再回頭來看 source code 應該就有感覺了:
#include <sys/time.h>
#include <event.h>
#include <stdio.h>
void printbuf(struct evbuffer *evbuf)
{
    for (;;) {
        char *buf = evbuffer_readline(evbuf);
        printf("* buf = %p, the string = \"\e[1;33m%s\e[m\"\n", buf, buf);
        if (buf == NULL)
            break;
        free(buf);
    }
}
int main(void)
{
    struct evbuffer *evbuf;
    evbuf = evbuffer_new();
    if (evbuf == NULL) {
        fprintf(stderr, "%s(): evbuffer_new() failed.\n", __func__);
        exit(1);
    }
    /* Add "gslin" into buffer. */
    u_char *buf1 = "gslin";
    printf("* Add \"\e[1;33m%s\e[m\".\n", buf1);
    evbuffer_add(evbuf, buf1, strlen(buf1));
    printbuf(evbuf);
    u_char *buf2 = " is reading.\nAnd he is at home.\nLast.";
    printf("* Add \"\e[1;33m%s\e[m\".\n", buf2);
    evbuffer_add(evbuf, buf2, strlen(buf2));
    printbuf(evbuf);
    evbuffer_free(evbuf);
}
 
 
No comments:
Post a Comment