1. 程式人生 > >libevent的作用或者說是有哪些功能

libevent的作用或者說是有哪些功能

可擴展性 select 使用 導入 dispatch dev 取數 設計應用 lec

1. 介紹

libevent是一個用來開發可擴展的網絡服務器的事件通知函數庫。當一個文件描述符上的特定事件發生或是一個超時時間到達後,libevent API提供一種執行回調函數的機制。而且,libevent還支持基於信號或定期超時的回調功能。

libevent旨在替換在原有事件驅動網絡服務器事件循環而設計的。應用程序僅僅需要調用event_dispatch(),然後動態地添加或是移除事件就可以了,而不需要改變原有的事件循環。

目前,libevent支持/dev/poll,kqueue(2),select(2),poll(2)和epoll(4)等高並發網絡編程模型。而它對實時信號的支持正處於實驗性階段。內部的事件處理機制是完全獨立於暴露出來的API的,並且新功能的加入並不需要重新設計應用程序,而是僅僅需要做一個簡單的libevent更新即可。因此,lievent允許可移植性的應用程序開發,並且能夠提供適合特定操作系統的最具可擴展性的事件通知機制。libevent同時也可用於多線程編程環境,更多說明請看Steven Grimm的說明。libevent可以在Linux,*BSD,Mac OS X,Solaris和Windows系統上編譯。

2. 標準用法

每一個使用libevent的程序,都需要包含<event.h>頭文件,並且需要傳遞-levent標誌給連接器linker。在使用任何庫函數之前,需要先調用event_init()或者event_base_new()函數制執行一次libevent庫的初始化。

3. 事件通知

對於每一個你想監視的文件描述符,你必須聲明一個事件結構並且調用event_set()去初始化結構中的成員。為了激活通知,你需要通過調用event_add()將該結構添加到監視事件列表。只要是該事件存活,那麽就需要保持該已allocated的事件結構,因此該事件結構需要在堆(heap)上申請。最後,需要調用event_dispatch()函數循環和調度事件。

4. I/O緩沖區

libevent提供了一個定期回調事件頂層的抽象。該抽象被稱為緩沖事件(buffered event)。緩沖事件提供自動地填充和流掉(drained)的輸入和輸出緩沖區。緩沖時間的用戶不再需要直接操作I/O,取而待之的是僅僅從輸入緩沖區讀,向輸出緩沖區寫就可以了。

一旦通過bufferevent_new()進行了初始化,bufferevent結構就可以通過bufferevent_enable()和bufferevent_disable()重復地使用了。作為替代,對一個套接口的讀寫需要通過調用bufferevent_read()和bufferevent_write()函數來完成。

當由於讀事件而激活bufferevent時,那麽後續將會自動回調讀函數從該文件描述符讀取數據。寫函數將會被回調,無論何時這個輸出緩沖區空間被耗盡到低於寫的下水位(low watemark),通常該值默認為0。

5. 定時器

libevent通過創建一個定時器來參與到一個經過一定超時時間後的回調事件中。evtimer_set()函數將準備(分配)一個事件結構被用於作為一個定時器。為了激活定時器,需要調用evtimer_add()函數。相反,需要調用evtimer_del()函數。

6. 超時

除了簡單的定時器,libevent可以為文件描述符指定一個超時事件,用於觸發經過一段時間後而沒有被激活的文件描述符執行相應的操作。timeout_set()函數可以為一個超時時間初始化一個事件結構。一旦被初始化成功,那麽這個事件必須通過timeout_add()函數激活。為了取消一個超時事件,可以調用timeout_del()函數。

7. 異步DNS解析

libevent提供了一個異步DNS解析器,可用於代替標準的DNS解析器。這些函數可以通過在程序中包含<evdns.h>頭文件而將其導入。在使用任何解析器函數之前,你必須調用evdns_init()函數初始化函數庫。為轉化一個域名到IP地址,可以調用evdns_resolve_ipv4()函數。為了執行一個反響查詢,你可以調用evdns_resolve_reverse()函數。所有的這些函數,在查找時都會使用回調的方式而避免阻塞的發生。

8. 事件驅動的HTTP服務器

libevent提供了一個簡單的可以嵌入到你的程序中的並能處理HTTP請求的事件驅動HTTP服務器。

為了使用這種能力,你應該在你的程序中包含<evhttp.h>頭文件。你可以通過調用evhttp_new()函數來創建一個服務器。通過evhttp_bind_socket()函數添加用於監聽的地址和端口。然後,你可以註冊一個或多個對到來請求的處理句柄。對於每一個URI可以通過evhttp_set_cb()函數指定一個回調。通常,一個回調函數也可以通過evhttp_set_gencb()函數完成註冊;如果沒有其他的回調已經被註冊得到該URI,那麽這個回調將會與其關聯。

9. RPC服務器和客戶端框架

libevent提供了一個創建RPC服務器和客戶端的編程框架。它將托管所有的編組和解組的數據結構

libevent的作用或者說是有哪些功能