【Linux系統程式設計】libevent庫bufferevent與evconnlistener

杨谖之發表於2024-04-14

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:要設定回撥函式的bufferevent
  • bufferevent_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回撥函式。

相關文章