libevent简介[翻译]3 前言
http://www.wangafu.net/~nickm/libevent-book/Ref0_meta.html
libevent手册:准备工作
libevent是一个用来实现跨平台非阻塞IO的库。它设计的目标是:
跨平台
用libevent写的程序可以在libevent支持的任何平台下运行。及时没有一个好的方案实现非阻塞IO,libevent也会支持一般的方法,那样你的程序也可以运行,只不过受到一些限制。
速度
libevent尝试在每个平台上使用最快的非阻塞IO的功能,这样就能实现更好的性能。
延展性
就算我们同时处理成千上万的socket,libevent也能工作的非常好。
便捷性
不管什么时候,用libevent实现功能,都是最稳定的,也是最方便的。
libevent拆分成下面几个模块:
evutil
最基本的模块,把不同平台的不同网络实现进行了抽象封装。
event and event_base
libevent的核心。它为不同平台特性,基于事件驱动的非阻塞IO的实现提供了抽象API。我们通过它可以知道socket什么时候准备好了或是可以读了或是可以写了,也可以实现最基本的定时器功能,探测OS的信号。
bufferevent
这些函数为libevent的基于事件驱动的核心功能提供了更便捷的封装用法。他可以使我们的程序请求到已经缓冲好的可读或是可写的数据,而不是当数据到达的时候告诉你数据已经准备好了。
这个bufferevent接口有各种各样的底层实现,所以可以在各种系统上提供性能更好的方案来实现非阻塞IO,比如在Windows下用IOCP的API。
evbuffer
这个是bufferevent的底层实现,提供了各种方法用于增加或是便捷的访问缓存。
evhttp
一个简单的C/S结构的HTTP功能
evdns
一个简单的C/S结构的DNS功能
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_core拆分出来,所以你不需要在使用libevent的时候连接pthread了,除非你的程序确实是多线程的。
libevent_openssl
这个库提供了加密通信的功能。它从libevent_core拆分出来,所以,除非你使用OpenSSL来进行加密通信,不然,不需要连接OpenSSL。
头文件
所有libevent公共的头文件都安装在event2的目录下,存放在三个文件夹中:
API 头文件
API头文件中定义了访问libevent的公共接口。这些头文件没有特殊的后缀。
兼容性头文件
这些头文件包含了过时的功能接口。不建议使用,除非你是为了维护历史遗留的工程。
结构体头文件
这个头文件中定义的结构体在不同平台或是版本中有可能会经常变化。有些是为了更快的访问结构体内容,有些是为了历史原因留下的。依赖于任何一个头文件中的结构体都有可能破坏你的程序对另一个版本libevent的兼容性。这些头文件包含 _struct.h 的后缀。
如果你必须使用老版本的libevent
老版本的头文件比较少,并不在event2的目录中。libevent2.0修改了一些API,使得它更合理,更不容易出错。如果可以的话,尽可能的使用新的API来编写你的程序。
OLD HEADERS | REPLACED BY CURRENT HEADERS |
event.h | event2/event*.h event2/buffer*.h event2/bufferevent*.h event2/tag*.h |
evdns.h | event2/dns*.h |
evhttp.h | event2/http*.h |
evrpc.h | event2/rpc*.h |
evutil.h | event2/util*.h |
在libevent2.0中,老的头文件和功能同样被封装在里面。
使用的时候需要注意
- 在1.4版本以前,只有一个libevent类库,就是现在被拆分到libevent_core和libevent_extra中的功能。
- 在2.0版本之前,并没有锁的功能,所以说,不能保证线程安全,除非你没有跨线程访问同一块数据
接下来会介绍一些可能会遇到的废弃的API
每个版本当前的状态
1.4.7之前的版本应该弃用了。1.3e之前的版本存在着很多bug。不能为1.4.x之前的版本提交新的功能补丁了。在1.3x之前碰到的bug,请在最新版本上确认是否存在,不然不予修改。