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。
總結
以上是生活随笔為你收集整理的Libevent源码学习笔记一:event2/event.h的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# winform实现excel导入
- 下一篇: 跳过Gapps