libevent+bufferevent總結

libevent+bufferevent總結

1 學習參考網址

libevent學習網址:http://blog.csdn.net/feitianxuxue/article/details/9372535html

http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html數組

http://www.cppblog.com/mysileng/archive/2013/02/04/197719.html函數

bufferevent學習網址:http://blog.csdn.net/feitianxuxue/article/details/9386843oop

http://blog.csdn.net/feitianxuxue/article/details/9386843學習

2 libevent和bufferevent的基礎知識

2.1 event_base

struct event_base {
 const struct eventop *evsel;
 void *evbase;
 int event_count; /* 事件總數 */
 int event_count_active; /* 活躍事件總數 */

 int event_gotterm; /* 設置終止事件循環 */
 int event_break; /* 設置當即終止事件循環 */

 /* 活躍事件管理 */
 struct event_list **activequeues; // 指針數組,數組索引是優先級priority
 int nactivequeues;

 /* signal處理信息 */
 struct evsignal_info sig;

 struct event_list eventqueue; // 註冊的事件列表
 struct timeval event_tv;

 struct min_heap timeheap;

 struct timeval tv_cache;
};this


event_base的結構以下圖:spa

2.2 bufferevent_new()

bufferevent_new(int fd, evbuffercb readcb, evbuffercb writecb,everrorcb errorcb, void *cbarg).net

CDN/CLS代碼中bufferevent_new的做用僅僅是將參數初始化。libevent的bufferevent在event的基礎上本身維護了一個buffer,它的結構以下:分別有本身的讀寫事件、讀寫緩衝區和讀寫回調函數。線程

struct bufferevent {指針

         struct event_base *ev_base;

 

         struct event ev_read;

         struct event ev_write;

 

         struct evbuffer *input;

         struct evbuffer *output;

 

         struct event_watermark wm_read;

         struct event_watermark wm_write;

 

         evbuffercb readcb;

         evbuffercb writecb;

         everrorcb errorcb;

         void *cbarg;

 

         int timeout_read;   /* 單位是秒 */

         int timeout_write;  /* 單位是秒 */

 

         short enabled;        /* 事件是否可用*/

};


2.3 event_base_set(struct event_base *base, struct event *ev)

修改structevent事件結構所屬的event_base爲指定的event_base。Libevnet內置一個全局的event_base結構。多個線程應用中,若是多個線程都須要一個libevent事件循環,須要調用event_base_set修改事件結構基於的event_base。bufferevent_base_set()就是把讀寫事件分別置爲指定值。

2.4 event_base_loopexit(m_pEvbase, &tv);

event_base_loopexit() 讓event_base在給定時間以後中止循環。要等到正在作的事件結束時纔會返回。

2.5 event_base_loop(m_pEvbase, 0)

int event_base_loop(struct event_base *, int);

等待事件被觸發,而後調用它們的回調函數。這是 event_base_dispatch的更靈活版本。默認狀況下,這個循環會一直運行,直到沒有添加的事件,或者直到調用了event_base_loopbreak()或者evenet_base_loopexit().你能夠經過flags參數修改這個行爲。

參數1:eb表示event_base結構體。

參數2:flags是EVLOOP_ONCE | EVLOOP_NONBLOCK的組合。

返回值:0表示成功,-1表示發生了錯誤,1表示沒有事件被註冊。

EVLOOP_ONCE: 阻塞直到有一個活躍的event,而後執行完活躍事件的回調就退出。

EVLOOP_NONBLOCK : 不阻塞,檢查哪一個事件準備好,調用優先級最高的那一個,而後退出。

 

3 使用說明

libevent用到的主要功能的實現須要的主要函數:

event_new();    初始化一個event

event_base_set(); 把event指針指向一個如今要用到的event

event_base_loop() 監聽事件,執行回調函數

在代碼中的表示以下:

bufferevent_new(sSocketHead.iFD, cb_Read, cb_Write, cb_Error, (void*)this);

實現了參數的初始化;

bufferevent_base_set(m_pEvbase, pSocketMsg->pBufev);將事件指針指向當前要運行的事件,其實裏面是將相應的讀寫事件的指針指向了須要運行的事件。

event_base_loop(m_pEvbase, 0);

監聽事件,執行回調函數。

相關文章
相關標籤/搜索