Libevent源码学习笔记一:event2/event.h
一、libevent標準使用方法:
每個程序使用Libevent必須include <event2/event.h> 頭文件,并 傳給 -levent ?鏈接器。如果只是想使用主要的event和buffered IO-based code,不想鏈接任何協(xié)議代買,使用鏈接 -levent_core。
二、安裝庫設置
在調(diào)用Libevent其他函數(shù)時,需要設置庫。例如在應用中使用多線程,需要先初始化線程支持,使用evthread_use_pthreads() or evthread_use_windows_threads().在<event2/thread.h>獲取更多信息。
另外,可以使用event_set_mem_functions來替換Libevent 內(nèi)存管理,想要測試 debug,使用event_enable_debug_mode().
三、 創(chuàng)建event base
Libevent是反應器(Reactor)模式,event_base就相當于反應器,event_base 負責監(jiān)視event是等待狀態(tài)還是就緒狀態(tài),每個event與一個event_base關聯(lián)。
四、事件通知機制
一個文件描述符對應一個event結(jié)構(gòu)體,可以使用event_new()來創(chuàng)建一個event結(jié)構(gòu)體,或者是聲明一個event structure,然后使用event_assign()來初始化event的成員。為了實現(xiàn)通知,使用event_add()來將事件添加到列表。只要事件是活動的,事件結(jié)構(gòu)必須保持分配,因此它一般應該在堆上分配。
五、循環(huán)處理事件
最后調(diào)用event_base_dispatch() 來循環(huán)處理事件。也可以使用event_base_loop 來實現(xiàn)更細致的控制。
一個線程只能處理一個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 在常規(guī)事件回調(diào)的頂部。這個abstraction 是 bufferevent。一個 bufferevent 提供自動填充和清理輸入和輸出緩沖。使用buffered event不再直接處理I/O,而是從輸入緩沖讀,輸出緩沖區(qū)寫。
一旦通過bufferevent_socket_new()初始化,bufferevnet 結(jié)構(gòu)體 通過bufferevent_enable()和bufferevent_diable()實現(xiàn)重復使用。以前是直接讀寫socket,使用bufferevent_socket后,改為使用bufferevent_read()和bufferevent_write()。
讀緩存水位分析:
1、? bufferevent用于數(shù)據(jù)接收和發(fā)送緩存。
2、? bufferevent內(nèi)建了兩個struct bufferevent對象,分別用于發(fā)送和接收緩存。
3、? 水位值用于實現(xiàn)對緩存區(qū)的管理。
4、? 從網(wǎng)絡模型分析bufferevent會自動從socket讀取數(shù)據(jù)緩存在bufferevent的接收緩存中。
5、? 當bufferevent存儲的數(shù)據(jù)到達低水位值時讀回調(diào)函數(shù)觸發(fā)。
6、? 低水位是0時,只要bufferevent從網(wǎng)絡收數(shù)據(jù)就會觸發(fā)讀回調(diào),也即數(shù)據(jù)可以立即被用戶讀走。
7、? 讀回調(diào)函數(shù)常規(guī)操作是從bufferevent中讀取數(shù)據(jù)(用戶讀取數(shù)據(jù))。
8、? 但是當bufferevent讀取的速度大于用戶從bufferevent讀取速度是,bufferevent中的數(shù)據(jù)量會達到高水位值。
9、? 當bufferevent緩存數(shù)據(jù)量達到高水位值時,bufferevent會停止從網(wǎng)絡接收數(shù)據(jù)。
10、當用戶從bufferevent中讀取了數(shù)據(jù)使水位值低于高水位值時,bufferevent又可以從網(wǎng)絡中接收新的數(shù)據(jù)。
寫緩存水位分析:
1、? 用戶先將數(shù)據(jù)寫入到bufferevent發(fā)送緩存。
2、? 當bufferevent發(fā)送緩存存儲的數(shù)據(jù)量達到低水位時,回調(diào)函數(shù)將被觸發(fā)。
3、? 當?shù)退粸?時,bufferevent緩存為空,寫進數(shù)據(jù)時寫回調(diào)被觸發(fā)。
4、? 回調(diào)函數(shù)的常規(guī)操作是將bufferevent發(fā)送緩存數(shù)據(jù)寫到網(wǎng)絡中。
5、? 當用戶寫入發(fā)送緩存數(shù)據(jù)快于回調(diào)函數(shù)將數(shù)據(jù)寫到網(wǎng)絡中時,水位值將達到高水位值。
6、? 高水位值沒有使用。
七、定時器
Libevent可以創(chuàng)建定時器來當超時時來調(diào)用回調(diào)函數(shù)。evtimer_new() 宏 返回一個使用定時器的event。為了激活定時器,調(diào)用evtimer_add()宏。可以使用evtimer_del()使用定時器失活。
這些宏使用對event_new(),event_add(),event_del的包裝。
八、evdns Asynchronous DNS resolution 異步DNS解決方案
Libevent 提供一個異步DNS來替代標準的DNS解決器。在<event2/dns.h>有更多函數(shù)
九、evhttp event-driven HTTP servers
Libevent提供一個非常簡單事件驅(qū)動的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()創(chuàng)建event
2.event_add()將event添加到event_base中
3.不再使用事件時,event_free()刪除事件
事件分為persistent和non-persistent。non-persistent事件,被觸發(fā)后只執(zhí)行一次,然后狀態(tài)變?yōu)閚on-pending;persistent事件當被觸發(fā)執(zhí)行回調(diào)函數(shù)后,狀態(tài)為pending然后在event_base繼續(xù)等待執(zhí)行,只用使用event_del()手動刪除事件將狀態(tài)改為non-pending。
總結(jié)
以上是生活随笔為你收集整理的Libevent源码学习笔记一:event2/event.h的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# winform实现excel导入
- 下一篇: 跳过Gapps