日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Libevent源码学习笔记一:event2/event.h

發布時間:2024/1/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()宏??梢允褂胑vtimer_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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。