一:libevent概述:html
libevent是一个用来编写快速、可移植、非阻塞IO程序的库,它的设计目标是:可移植性、高效、可扩展性、便捷。windows
libevent包含下列组件:后端
evutil:对不一样平台下的网络实现的差别进行抽象;缓存
event、event_base:libevent的核心。为各类平台特定的、基于事件的非阻塞IO后端提供抽象API,让程序能够知道套接字什么时候已经准备好读或写,而且处理基本的超时功能,检测OS信号。安全
bufferevent:为libevent基于事件的核心提供更方便的封装。可使你的程序请求缓存的读和写,让你知道什么时候真正的发生IO,而不是在sockets准备好时通知你。(bufferevent接口拥有多个后端,这样能够有效的利用系统提供的更高速的非阻塞IO方式,好比windows的IOCPAPI。)服务器
evbuffer:在bufferevent层之下实现了缓冲功能,而且提供了方便有效的访问函数。网络
evhttp:一个简单的HTTP客户端/服务器实现。多线程
evdns:一个简单的DNS客户端/服务器实现。socket
evrpc:一个简单的RPC实现。函数
二:库
当构件libevent时,默认状况下,它会安装下面的库:
libevent_core:包含全部核心的事件和缓存功能。该库包含了全部的event_base, evbuffer, bufferevent和其余功能函数。
libevent_extra:该库定义了特定协议的功能,好比HTTP,DNS和RPC。
libevent:该库只因历史缘由而存在;他包含了libevent_core 和libevent_extra的内容。该库不该该在使用;它将会在将来的libevent删除。
下面的库只会在某些平台上安装:
libevent_pthreads:该库基于可移植线程库pthreads,增长了线程和锁的实现机制。它独立于libevent_core,所以,除非你要在多线程中使用libevent,不然不须要链接pthreads库。
libevent_openssl:这个库为使用bufferevent和OpenSSL进行加密的通讯提供支持。它独立于libevent_core,所以,除非你确实须要加密通讯,不然不须要链接OpenSSL库。
三:头文件
目前,全部的libevent头文件都安装在event2目录下。头文件分为三类:
API头文件:定义libevent的共用接口。这些头文件没有特定后缀。
兼容头文件:包含那些不推荐使用的函数的定义。除非使用较老版本的libevent,不然不须要包含这种头文件。
结构头文件:这类头文件以相对不稳定的布局定义各类结构体。这些结构体中的一些是为了提供快速访问而暴露;一些是由于历史缘由而暴露。直接依赖这类头文件中的任何结构体都会破坏程序对其余版本libevent的二进制兼容性,有时候是以很是难以调试的方式出现。这类头文件具备后缀“_struct.h”。
(还存在不在event2目录中的较老版本libevent的头文件,请参考下节:使用老版本libevent)
四:使用老版本Libevent
Libevent 2.0已经通过修订,使其更加合理和健壮,若是可能的话,应该使用Libevent2.0的API。可是某些时候,你可能不得不使用老版本的API。
老版本的Libevent的头文件较少,并且没有安装在event2目录下:
OLD HEADER… |
…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 |
在2.0以及之后版本的libevent中,老的头文件仍然会做为新头文件的封装而存在。
其余关于使用较老版本的提示:
1.4版以前只有一个库libevent,它包含如今分散到libevent_core和libevent_extra中的全部功能。
2.0版以前不支持锁:只有肯定不一样时在多个线程中使用同一个结构体时,libevent才是线程安全的。
原文:http://www.wangafu.net/~nickm/libevent-book/Ref0_meta.html