libevent庫bufferevent與evconnlistener
介紹
bufferevent是libevent提供的一個自帶輸入輸出緩衝區的事件模型,bufferevent監聽socket檔案描述符的讀寫等事件,並自動將核心緩衝區中的資料讀寫到使用者區的緩衝區,並自動觸發相應的回撥函式。
evconnlistener封裝了socket、bind、listen、accept幾個函式,當有客戶端連線的時候,自動accept並呼叫回撥函式。
相關函式
bufferevent_socket_new()
函式說明
基於一個已有的socket建立一個socket bufferevent。
函式原型
#include <event2/bufferevent.h>
struct bufferevent* bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options);
函式引數
struct event_base *base
:新增事件的event_base結構體。evutil_socket_t fd
:需要監聽的socket檔案描述符。int options
:配置標誌BEV_OPT_THREADSAFE
:使bufferevent能夠在多執行緒下是安全的BEV_OPT_CLOSE_ON_FREE
:釋放buffer_event時,自動關閉底層介面(關閉檔案描述符)
函式返回值
- 成功返回
bufferevent
的結構體指標 - 失敗返回nullptr
bufferevent_socket_connect()
函式說明
連線到對端socket,自動繫結配置bufferevent。
函式原型
int bufferevent_socket_connect(struct bufferevent *bufev, const struct sockaddr *addr, int socklen);
函式引數
struct bufferevent *bufev
:需要繫結的bufferevent結構體指標。const struct sockaddr *addr
:要連線的對端sockaddr資訊。int socklen
:第二個引數的大小。
函式返回值
- 成功返回0,失敗返回-1
void bufferevent_free(struct bufferevent *bufev)
函式說明
釋放bufferevent
函式引數
struct bufferevent *bufev
:要釋放的bufferevent結構體指標
bufferevent_setcb()
函式說明:設定bufferevent的回撥函式。
函式原型
void bufferevent_setcb(
struct bufferevent *bufev,
bufferevent_data_cb readcb,
bufferevent_data_cb writecb,
bufferevent_event_cb eventcb,
void *cbarg
);
函式引數
struct bufferevent *bufev
:要設定回撥函式的buffereventbufferevent_data_cb readcb
:讀事件回撥函式bufferevent_data_cb writecb
:寫事件回撥函式typedef void(* bufferevent_data_cb) (struct bufferevent *bev, void *ctx)
:bev是呼叫該函式的bufferevent結構體指標,ctx是使用者定義上下文的指標,用來傳遞引數
bufferevent_event_cb eventcb
:特殊事件回撥函式typedef void(* bufferevent_event_cb) (struct bufferevent *bev, short what, void *ctx)
:what用來標識發生了什麼事件BEV_EVENT_EOF
:遇到檔案結束指示BEV_EVENT_ERROR
:發生錯誤BEV_EVENT_TIMEOUT
:發生超時BEV_EVENT_CONNECTED
:請求的過程中連線已經完成
void *cbarg
:回撥函式的引數
size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size)
函式說明:從bufferevent的緩衝區讀取資料到data,data大小為size(最大讀入size大小),返回實際讀入的資料長度。
int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size)
函式說明:將data中的資料寫到bufferevent的緩衝區,大小為size,返回實際寫入的資料長度。
int bufferevent_enable(struct bufferevent *bufev, short event)
函式說明:使能bufferevent的回撥函式。
函式引數
short event
:要使能的事件,可為EV_READ | EV_WRITE
的組合。
int bufferevent_disable(struct bufferevent *bufev, short event)
函式說明:失能相關事件。
evconnlistener_new_bind()
函式說明:建立套接字並連線,同時初始化evconnlistener。
函式原型
struct evconnlistener* evconnlistener_new_bind(
struct event_base *base,
evconnlistener_cb cb,
void *ptr,
unsigned flags,
int backlog,
const struct sockaddr *sa,
int socklen
)
函式引數
evconnlistener_cb cb
:監聽事件的回撥函式
-typedef void(* evconnlistener_cb) (struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *)
:引數分別為evconnlistener的結構體指標、客戶端連線的檔案描述符、客戶端地址埠資訊、sockaddr長度、自定義的引數指標。void *ptr
:回撥函式引數unsigned flags
:配置標誌LEV_OPT_LEAVE_SOCKETS_BLOCKING
:檔案描述符為阻塞的LEV_OPT_CLOSE_ON_FREE
關閉時自動釋放LEV_OPT_REUSEABLE
:埠複用LEV_OPT_THREADSAFE
:分配鎖, 執行緒安全
int backlog
:全連線佇列長度,使用-1自動配置const struct sockaddr *sa
:用來監聽的ip、埠、協議,與手動bind相同
void evconnlistener_free(struct evconnlistener *lev)
函式說明:釋放evconnlistener。
int evconnlistener_enable(struct evconnlistener *lev)
函式說明:使能evconnlistener回撥函式。
int evconnlistener_disable(struct evconnlistener *lev)
函式說明:失能evconnlistener回撥函式。