Libevent is a library for writing fast portable nonblocking IO.html
libevent是一個爲編寫快速可移植的非阻塞IO程序而設計的。後端
libevent包括瞭如下組件:安全
1. evutil服務器
Generic functionality to abstract out the differences between different platforms' networking implementations.網絡
用於抽象不一樣平臺網絡實現差別的通用功能。數據結構
2. event & event_base多線程
This is the heart of Libevent. It provides an abstract API to the various platform-specific, event-based nonblocking IO backends. It can let you know when sockets are ready to read or write, do basic timeout functionality, and detect OS signals.app
libevent的核心,爲各類平臺特定的、基於事件的非阻塞IO後端(backend,即epoll、select等)提供抽象API。它們可以通知應用套接字是否已經準備好讀或者寫,並具有處理超時的基本功能,且可以檢測操做系統信號。框架
3. buffereventless
These functions provide a more convenient wrapper around Libevent’s event-based core. They let your application request buffered reads and writes, and rather than informing you when sockets are ready to do, they let you know when IO has actually occurred.
(The bufferevent interface also has multiple backends, so that it can take advantage of systems that provide faster ways to do nonblocking IO, such as the Windows IOCP API.)
bufferevent中的函數爲libevent基於事件的核心提供了使用更方便的封裝。它們使得咱們的應用能夠請求已經緩衝的讀寫操做。另外,它們讓咱們知道IO讀寫已經真正發生,而不是當套接字準備好讀或寫就通知咱們。
(bufferevent接口有多個後端,它能夠採用系統提供的更快的非阻塞IO後端,例如Windows中的IOCP API。)
4. evbuffer
This module implements the buffers underlying bufferevents, and provides functions for efficient and/or convenient access.
在bufferevent層之下實現了緩衝功能,而且提供了方便有效的訪問函數。
5. evhttp
A simple HTTP client/server implementation.
一個簡單的HTTP客戶端/服務器實現。
6. evdns
A simple DNS client/server implementation.
一個簡單的DNS客戶端/服務器實現。
7. evrpc
A simple RPC implementation.
一個簡單的RPC實現。
All current public Libevent headers are installed under the event2 directory. Headers fall into three broad classes:
libevent公用頭文件都安裝在event2目錄中。頭文件能夠大概分爲三類:
1. API headers
An API header is one that defines current public interfaces to Libevent. These headers have no special suffix.
定義libevent公用接口。這類頭文件沒有特定後綴。
2. Compatibility headers
A compatibility header includes definitions for deprecated functions. You shouldn’t include it unless you’re porting a program from an older version of Libevent.
爲已廢棄的函數提供兼容。不該該使用這類頭文件,除飛要移植使用較老版本libevent的程序。
3. Structure headers
These headers define structures with relatively volatile layouts. Some of these are exposed in case you need fast access to structure component; some are exposed for historical reasons. Relying on any of the structures in headers directly can break your program’s binary compatibility with other versions of Libevent, sometimes in hard-to-debug ways. These headers have the suffix "_struct.h"
這類頭文件以相對不穩定的佈局定義各類結構體。這些結構體中的一些是爲了提供快速訪問而暴露;一些是由於歷史緣由而暴露。直接依賴這類頭文件中的任何結構體都會破壞程序對其餘版本libevent的二進制兼容性。這些問題有時候是以很是難以調試的方式出現。這類頭文件具備後綴「_struct.h」。
libevent的源代碼雖然都在一層文件夾下面,可是其代碼分類仍是至關清晰的,主要可分爲頭文件、內部使用的頭文件、輔助功能函數、日誌、libevent框架、對系統I/O多路複用機制的封裝、信號管理、定時事件管理、緩衝區管理、基本數據結構和基於libevent的兩個實用庫等幾個部分,有些部分可能就是一個源文件。
源代碼中的test部分就不在咱們關注的範疇了。
1)頭文件
主要就是event.h:事件宏定義、接口函數聲明,主要結構體event的聲明;
2)內部頭文件
xxx-internal.h:內部數據結構和函數,對外不可見,以達到信息隱藏的目的;
3)libevent框架
event.c:event總體框架的代碼實現;
4)對系統I/O多路複用機制的封裝
epoll.c:對epoll的封裝;
select.c:對select的封裝;
devpoll.c:對dev/poll的封裝;
kqueue.c:對kqueue的封裝;
5)定時事件管理
min-heap.h:其實就是一個以時間做爲key的小根堆結構;
6)信號管理
signal.c:對信號事件的處理;
7)輔助功能函數
evutil.h 和evutil.c:一些輔助功能函數,包括建立socket pair和一些時間操做函數:加、減和比較等。
8)日誌
log.h和log.c:log日誌函數
9)緩衝區管理
evbuffer.c和buffer.c:libevent對緩衝區的封裝;
10)基本數據結構
compat/sys下的兩個源文件:queue.h是libevent基本數據結構的實現,包括鏈表,雙向鏈表,隊列等;_libevent_time.h:一些用於時間操做的結構體定義、函數和宏定義;
11)實用網絡庫
http和evdns:是基於libevent實現的http服務器和異步dns查詢庫;
1. event_core
All core event and buffer functionality. This library contains all the event_base, evbuffer, bufferevent, and utility functions.
該庫包含了全部核心的事件和緩衝功能,包含了全部的event_base、evbuffer、bufferevent和輔助(utility)函數。
2. event_extra
This library defines protocol-specific functionality that you may or may not want for your application, including HTTP, DNS, and RPC.
該庫定義了程序可能須要,也可能不須要的協議特定功能,包括HTTP、DNS和RPC。
3. event
This library exists for historical reasons; it contains the contents of both libevent_core and libevent_extra. You shouldn’t use it; it may go away in a future version of Libevent.
這個庫由於歷史緣由而存在,它包含了libevent_core和libevent_extra的內容。咱們不該該使用這個庫。將來版本的libevent可能去掉這個庫。
某些平臺上可能安裝下列庫:
4. event_pthreads
This library adds threading and locking implementations based on the pthreads portable threading library. It is separated from libevent_core so that you don’t need to link against pthreads to use Libevent unless you are actually using Libevent in a multithreaded way.
該庫添加了基於pthread可移植線程庫的線程和鎖實現。它獨立於libevent_core,這樣程序使用libevent時就不須要連接到pthread,除非是以多線程方式使用libevent。
5. event_openssl
This library provides support for encrypted communications using bufferevents and the OpenSSL library. It is separated from libevent_core so that you don’t need to link against OpenSSL to use Libevent unless you are actually using encrypted connections.
該庫爲使用bufferevent和OpenSSL的加密通訊提供支持。它獨立於libevent_core,這樣程序使用libevent時就不須要連接到OpenSSL,除非是進行加密通訊。
libevent 2.0以更合理的、不易出錯的方式修正了API。若是可能,編寫新程序時應該使用libevent 2.0。可是有時候可能須要使用較老的API,例如在升級已存的應用時,或者支持由於某些緣由不能安裝2.0或者更新版本libevent的環境時。較老版本的libevent頭文件較少,也不安裝在event2目錄中。
在2.0以及之後版本的libevent中,老的頭文件仍然會做爲新頭文件的封裝而存在。
其餘關於使用較老版本的提示: