Libevent概览
Libevent是面向高速可移植非阻塞IO需求的。它的设计目标是:
可移植性
使用Libevent的程序应该可以在所有Libevent支持的平台下使用。即使在特定平台下不存在真正的非阻塞IO,Libevent也应该能够以近似的方式实现,这样的话即使在特定平台下使用非阻塞IO的程序也可以运行。
速度
Libevent试图在不同的平台上采用它们各自最高效快速的非阻塞IO且不带来过多额外开销。
扩展性
Libevent一开始就是为了能完美服务成千上万的活跃socket而设计的。
便捷
只要条件允许,在编写采用Libevent的程序时应该按照稳定且可移植的方法编写。
Libevent被划分为下列部分:
evutil
屏蔽不同平台网络实现的差异,对外提供统一的函数接口。
event event_base
这是Libevent的核心。它从不同平台基于事件的非阻塞IO抽象出一个统一的API接口。它可以通知你socket是否已经准备好读写,完成基础的超时功能,以及检测OS信号。
bufferevent
在Libevent基于事件的核心基础上,这些函数可以提供更方便的封装。它们让你的应用在缓冲区中请求读写,而不是直接在socket就绪时通知你,但是会在IO发生时通知你。
bufferevent接口也有多种的后台实现方式,所以在能够更快进行非阻塞IO的平台下表现更好,比如说Windows下IOCP的API。
evbuffer
这个模块实现bufferevents下的缓冲机制,并提供有效方便的缓冲区访问方式。
evhttp
对HTTP C/S模型的简单实现。
evdns
对DNS C/S模型的简单实现。
evrpc
对RPC的简单实现。
库
Libevent安装时会默认安装下列库:
libevent_core
-
所有核心event和buffer功能。这个库包括所有event_base,evbuffer,bufferevent和utility函数。
-
libevent_extra
-
这个库包括一些你可能需要的一些要求特定协议的功能,包括HTTP,DNS和RPC。
libevent
-
这个库为了向下兼容而保留,包括libevent_core和libevent_extra中的内容。不推荐使用这个库,因为在后续版本中可能会被废除。
下列库只会在特定平台上安装:
-
libevent_pthreads
-
这个库在pthread库基础上为libevent添加多线程支持。它被从libevent_core中分离出来,你只在确实使用多线程的时候链接这个库。
libevent_openssl
-
这个库为使用bufferevent和OpenSSL库的加密通信提供支持。它被从libevent_core中分离出来,你只在确实使用加密连接时链接这个库。
头文件
所有对外的Libevent头文件都安装在event2目录下。头文件被分为三大类:
-
API头文件
-
API头文件定义了当前版本Libevent的对外接口。这些头文件不需要特殊后缀。
为了兼容性的头文件
-
为了兼容性的头文件包括了弃用的函数声明。你应该只在引用使用古老版本的libevent的程序时包括这些头文件。
结构体头文件
-
这些头文件定义了相对活跃的底层结构。一部分结构是为了你能够快捷访问而提供,也有一部分结构是因为历史原因提供。依赖任何头文件中的结构体都可能导致你的程序在不同版本Libevent下无法通用,有时候还是以很隐蔽的方式出问题。这些头文件的后缀是“_struct.h”。
(在历史版本的Libevent中也有头文件是不在event2目录下的。详情见下文。)
如果你需要使用历史版本的Libevent
Libevent 2.0出于使用更合理和降低报错的目的修订了API。如果条件允许,你应该采用Libevent 2.0的API来编写新程序。但有时候你必须采用以前的API,无论是升级现有程序还是为了支持出于某些原因无法安装新版本Libevent。
历史版本的Libevent头文件比较少,而且也没有安装在目录event2下:
曾经的头文件… | …现在的头文件 |
---|---|
event.h | event2/event*.h, event2/buffer*.h event2/bufferevent*.hevent2/tag*.h |
evdns.h | event2/dns*.h |
evhttp.h | event2/http*.h |
evrpc.h | event2/rpc*.h |
evutil.h | event2/util*.h |
在2.0版本之后,以前的头文件依然作为对新头文件的封装保留下来。
其它使用旧版时需要注意的事项:
-
在1.4版本之前,只有“libevent”库,等同于现在的libevent_core和libevent_extra。
-
在2.0版本之前,不支持锁;Libevent仅在你不会在两个线程同时使用相同的结构时保证线程安全。