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緩衝區socket
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服務器和客戶端的編程框架。它將託管全部的編組和解組的數據結構