Libevent開源庫之evbuffer

2021-07-11 14:58:36 字數 905 閱讀 5921

前言

可以說對於任何網路庫(模組)而言,乙個緩衝模組都是必不可少的。緩衝模組主要用於緩衝從網路接收到的資料,以及

使用者提交的資料(用於傳送)。很多時候,我們還需要將網路模組層(非tcp層)的這些緩衝資料拷貝到使用者層,而這些記憶體拷貝

都會消耗時間。

在這裡,我簡要分析下libevent的相關**(event.h和buffer.c)。

結構

關於libevent的緩衝模組,主要就是圍繞evbuffer結構體展開。先看下evbuffer的定義:

struct

evbuffer;

libevent的緩衝是乙個連續的記憶體區域,其處理資料的方式(寫資料和讀資料)更像乙個佇列操作方式:從後寫入,從前

讀出。evbuffer分別設定相關指標(乙個指標)用於指示讀出位置和寫入位置。其大致結構如圖:

orig_buffer指向由realloc分配的連續記憶體區域,buffer指向有效資料的記憶體區域,totallen表示orig_buffer指向的記憶體

區域的大小,misalign表示buffer相對於orig_buffer的偏移,off表示有效資料的長度。

實際運作

這裡我將結合具體的**分析libevent是如何操作上面那個佇列式的evbuffer的,先看一些輔助函式:

void

evbuffer_drain(

struct

evbuffer 

*buf, size_t len)

該函式主要操作一些指標,當每次從evbuffer裡讀取資料時,libevent便會將buffer指標後移,同時增大misalign,減小off,

而該函式正是做這件事的。說白了,該函式就是用於調整緩衝佇列的前向指標。

基於事件的開源網路庫 libevent 應用例項

本文例子不加修改在windows下執行 須定義巨集win32,鏈結ws2 32.lib,libevent core.lib 稍加修改 例如去掉windows所特有的socket初始化 可執行於linux。該例子建立了乙個event base,在此base上,增加了兩個event,也就是設定了兩個定時...

libevent庫的使用方法

接寫乙個很簡單的 time server 來當作例子 當你連上去以後 server 端直接提供時間,然後結束連線。event init 表示初始化 libevent 所使用到的變數。event set ev,s,ev read ev persist,connection accept,ev 把 s ...

Qt 之 ZIP開源庫 QuaZIP

quazip是使用qt,c 對zlib進行簡單封裝的用於壓縮zip以及解壓縮zip的開源庫。如果你的qt專案當中用到了壓縮以及解壓縮zip的話你可以考慮選擇使用它。quazip目前支援以下幾個平台 quazip是基於zlib庫的,所以編譯之前必須編譯完zlib或者匯入zlib的lib和標頭檔案。預設...