Libevent源碼學習筆記一:event2/event.h


一、libevent標准使用方法:

  每個程序使用Libevent必須include <event2/event.h> 頭文件,並 傳給 -levent  鏈接器。如果只是想使用主要的event和buffered IO-based code,不想鏈接任何協議代買,使用鏈接 -levent_core。

二、安裝庫設置

  在調用Libevent其他函數時,需要設置庫。例如在應用中使用多線程,需要先初始化線程支持,使用evthread_use_pthreads() or evthread_use_windows_threads().在<event2/thread.h>獲取更多信息。

  另外,可以使用event_set_mem_functions來替換Libevent 內存管理,想要測試 debug,使用event_enable_debug_mode().

三、 創建event base

  Libevent是反應器(Reactor)模式,event_base就相當於反應器,event_base 負責監視event是等待狀態還是就緒狀態,每個event與一個event_base關聯。

四、事件通知機制

  一個文件描述符對應一個event結構體,可以使用event_new()來創建一個event結構體,或者是聲明一個event structure,然后使用event_assign()來初始化event的成員。為了實現通知,使用event_add()來將事件添加到列表。只要事件是活動的,事件結構必須保持分配,因此它一般應該在堆上分配。

五、循環處理事件

  最后調用event_base_dispatch() 來循環處理事件。也可以使用event_base_loop 來實現更細致的控制。

  一個線程只能處理一個event_base。If you want to run events in multiple threads at once, you can either have a single event_base whose events add work to a work queue,or you can create multiple event_base objects.

六、bufferevent I/O Buffers 緩沖輸入輸出

  Libevent提供 一個 buffered I/O abstraction 在常規事件回調的頂部。這個abstraction 是 bufferevent。一個 bufferevent 提供自動填充和清理輸入和輸出緩沖。使用buffered event不再直接處理I/O,而是從輸入緩沖讀,輸出緩沖區寫。

  一旦通過bufferevent_socket_new()初始化,bufferevnet 結構體 通過bufferevent_enable()和bufferevent_diable()實現重復使用。以前是直接讀寫socket,使用bufferevent_socket后,改為使用bufferevent_read()和bufferevent_write()。

讀緩存水位分析:

1、  bufferevent用於數據接收和發送緩存。

2、  bufferevent內建了兩個struct bufferevent對象,分別用於發送和接收緩存。

3、  水位值用於實現對緩存區的管理。

4、  從網絡模型分析bufferevent會自動從socket讀取數據緩存在bufferevent的接收緩存中。

5、  當bufferevent存儲的數據到達低水位值時讀回調函數觸發。

6、  低水位是0時,只要bufferevent從網絡收數據就會觸發讀回調,也即數據可以立即被用戶讀走。

7、  讀回調函數常規操作是從bufferevent中讀取數據(用戶讀取數據)。

8、  但是當bufferevent讀取的速度大於用戶從bufferevent讀取速度是,bufferevent中的數據量會達到高水位值。

9、  當bufferevent緩存數據量達到高水位值時,bufferevent會停止從網絡接收數據。

10、當用戶從bufferevent中讀取了數據使水位值低於高水位值時,bufferevent又可以從網絡中接收新的數據。

 

寫緩存水位分析:

1、  用戶先將數據寫入到bufferevent發送緩存。

2、  當bufferevent發送緩存存儲的數據量達到低水位時,回調函數將被觸發。

3、  當低水位為0時,bufferevent緩存為空,寫進數據時寫回調被觸發。

4、  回調函數的常規操作是將bufferevent發送緩存數據寫到網絡中。

5、  當用戶寫入發送緩存數據快於回調函數將數據寫到網絡中時,水位值將達到高水位值。

6、  高水位值沒有使用。

七、定時器

  Libevent可以創建定時器來當超時時來調用回調函數。evtimer_new() 宏 返回一個使用定時器的event。為了激活定時器,調用evtimer_add()宏。可以使用evtimer_del()使用定時器失活。

這些宏使用對event_new(),event_add(),event_del的包裝。

八、evdns Asynchronous DNS resolution 異步DNS解決方案

Libevent 提供一個異步DNS來替代標准的DNS解決器。在<event2/dns.h>有更多函數

九、evhttp event-driven HTTP servers

Libevent提供一個非常簡單事件驅動的HTTP服務器,可以集成到程序中並處理HTTP請求

<event2/http.h>

十、evrpc  A framework for RPC servers and clients

Libevent provides a framework for creating RPC servers and clients. It takes care of marshaling and unmarshaling all data structures.
event2/event.h
The primary libevent header

十一、Libevent主要頭文件

1.event2/thread.h
Functions for use by multithreaded programs

2.event2/buffer.h and event2/bufferevent.h
Buffer management for network reading and writing

3.event2/util.h
Utility functions for portable nonblocking network code

4.event2/dns.h
Asynchronous DNS resolution

5.event2/http.h
An embedded libevent-based HTTP server

6.event2/rpc.h
A framework for creating RPC servers and clients

十二、event structure

事件處理步驟:

  1.event_new()創建event

  2.event_add()將event添加到event_base中

  3.不再使用事件時,event_free()刪除事件

事件分為persistent和non-persistent。non-persistent事件,被觸發后只執行一次,然后狀態變為non-pending;persistent事件當被觸發執行回調函數后,狀態為pending然后在event_base繼續等待執行,只用使用event_del()手動刪除事件將狀態改為non-pending。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM