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學習
struct event_base { |
event_base的結構以下圖:spa
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; /* 事件是否可用*/ }; |
修改structevent事件結構所屬的event_base爲指定的event_base。Libevnet內置一個全局的event_base結構。多個線程應用中,若是多個線程都須要一個libevent事件循環,須要調用event_base_set修改事件結構基於的event_base。bufferevent_base_set()就是把讀寫事件分別置爲指定值。
event_base_loopexit() 讓event_base在給定時間以後中止循環。要等到正在作的事件結束時纔會返回。
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 : 不阻塞,檢查哪一個事件準備好,調用優先級最高的那一個,而後退出。
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);
監聽事件,執行回調函數。