libevent庫的使用方法

2022-09-23 09:51:09 字數 2730 閱讀 4641

接寫乙個很簡單的 time server 來當作例子:當你連上去以後 server 端直接提供時間,然後結束連線。event_init() 表示初始化 libevent 所使用到的變數。event_set(&ev, s, ev_read | ev_persist, connection_accept, &ev) 把 s 這個 file description 放入 ev (第乙個引數與第二個引數),並且告知當事件 (第三個引數的 ev_read) 發生時要呼叫 connection_accept() (第四個引數),呼叫時要把

ev 當作引數丟進去 (第五個引數)。其中的 ev_persist 表示當呼叫進去的時候不要把這個 event 拿掉 (繼續保留在 event queue 裡面),這點可以跟 connection_accept() 內在註冊 connection_time() 的**做比較。而 event_add(&ev, null) 就是把 ev 註冊到 event queue 裡面,第二個引數指定的是 timeout 時間,設定成 null 表示忽略這項設定。

注:這段**來自於網路,雖然很粗糙,但是對libevent的使用方法已經說明的很清楚了.

附原始碼:

#include

#include

#include

#include

#include

#include

void connection_time(int fd, short event, struct event *arg)

void connection_accept(int fd, short event, void *arg)

/* install time server. */

struct event *ev = malloc(sizeof(struct event));

event_set(ev, ns, ev_write, (void *) connection_time, ev);

event_add(ev, null);

}

int main(void)

/* bind() */

struct sockaddr_in s_in;

bzero(&s_in, sizeof(s_in));

s_in.sin_family = af_inet;

s_in.sin_port = htons(7000);

s_in.sin_addr.s_addr = inaddr_any;

if (bind(s, (struct sockaddr *) &s_in, sizeof(s_in)) < 0)

/* listen() */

if (listen(s, 5) < 0)

/* initial libevent. */

event_init();

/* create event. */

struct event ev;

event_set(&ev, s, ev_read | ev_persist, connection_accept, &ev);

/* add event. */

event_add(&ev, null);

event_dispatch();

return 0;

} 在寫 nonblocking network program 通常要處理 buffering 的問題,但並不好寫,主要是因為 read() 或 recv() 不保證可以一次讀到一行的份量進來。

在 libevent 裡面提供相當不錯的 buffer library 可以用,完整的說明在 man event 的時候可以看到,最常用的應該就是以 evbuffer_add()、evbuffer_readline() 這兩個 function,其他的知道存在就可以了,需要的時候再去看詳細的用法。

下面直接提供 libevent-buff.c 當作範例,編譯後看執行結果,再回頭來看 source code 應該就有感覺了:

#include

#include

#include

void printbuf(struct evbuffer *evbuf)

}

int main(void)

/* 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);

}

最後的 event_dispatch() 表示進入 event loop,當 queue 裡面的任何乙個 file description 發生事件的時候就會進入 callback function 執行。

json c 庫的使用方法

引入json c的庫 json c的讀寫操作 讀json c json object pobj null pobj json object from file bob.json 讀檔案裡的資料 pval json object object get jobj,sname type json obje...

BeautifulSoup庫的使用方法

from bs4 import beautifulsoup import lxml html the dormouse s story once upon a time there were three little sisters and their names were elsie,lacie ...

動態庫使用方法

動態庫api介紹 include void dlopen const char filename,intflag char dlerror void void dlsym void handle,const char symbol int dlclose void handle dlopen 以指定...