[翻译]Libevent 参考手册:前言
Libevent 参考手册:前言
从一万英尺外看 Libevent
Libevent 是一个用于编写高速的、可移植的非阻塞IO的应用库,其设计目标是:
- 可移植性
-
使用 Libevent 编写的程序应该可以在 Libevent 支持的所有平台上工作。即使没有一个真正好的方式来实现非阻塞IO,Libevent 也应该支持还过得去的方式,让程序可以在受限制的环境中运行。
- 速度
-
Libevent 在每个平台上尝试使用最高速的非阻塞IO实现方式,并且没有因为这做而引入太多的额外开销。
- 可扩展性
-
Libevent 被设计为即使程序需要上万个活动套接字的时候也可以良好工作。
- 方便性
-
无论何时,最自然的使用 Libevent 编写程序的方式应该是稳定的、可移植的。
Libevent 被划分为下列组件:
- evutil
-
用于抽象不同平台网络实现差异的通用功能。
- event and event_base
-
Libevent 的核心,为各种平台特定的、基于事件的非阻塞IO后端提供抽象API,让程序可以知道套接字何时已经准备好,可以读或者写,并且处理基本的超时功能,以及检测OS信号。
- bufferevent
-
这些函数为基于事件的 Libevent 核心提供了更方便的封装。它们让你的程序可以请求缓冲的读取和写入,而不是当套接字准备好读或写的时候通知你,让你知道何时IO已经真正发生。
bufferevent 接口有多个后端,使它可以充分利用系统能够提供的更快的方式去实现非阻塞IO,如 Windows 中的 IOCP。
- evbuffer
-
这个模块实现了 bufferevent 相关的缓冲区,并且提供了一些函数方便有效的进行 and/or 访问。
- evhttp
-
一个简单的 HTTP 客户端/服务器实现。
- evdns
-
一个简单的 DNS 客户端/服务器实现。
- evrpc
-
一个简单的 RPC 实现。
相关的库
当 Libevent 创建时,默认情况下它会安装下列库:
- libevent_core
-
所有核心的事件和缓冲功能,这个库包含了所有的event_base、evbuffer、bufferevent和工具函数。
- libevent_extra
-
这个库定义了程序可能需要,也可能不需要的协议特定功能,包括 HTTP、DNS 和 RPC。
- libevent
-
这个库因为历史原因而存在,它包含了 libevent_core 和 libevent_extra 的内容。你不应该使用这个库,未来的 Libevent 版本中可能去掉这个库。
某些平台上可能会安装下列库:
- libevent_pthreads
-
这个库添加了基于 pthread 可移植线程库的线程和锁实现。它独立于 libevent_core,这样程序使用 Libevent 时就不需要链接到 pthread,除非是你真正的以多线程方式使用 Libevent。
- libevent_openssl
-
这个库为使用 bufferevent 和 OpenSSL 进行加密的通信提供支持。它独立于 libevent_core,这样程序使用 Libevent 时就不需要链接到 OpenSSL,除非你是真正的要进行加密通信。
头文件
所有当前版本的 Libevent 公用头文件都安装在 event2 目录中,头文件分为三大类:
- API headers (API头文件)
-
这些API头文件定义了当前的 Libevent 公用接口。这类头文件没有特定后缀。
- Compatibility headers (兼容性头文件)
-
为已废弃的函数提供兼容的头文件定义。不应该使用这类头文件,除非是在移植旧版本的 Libevent 程序的时候。
- Structure headers (结构体头文件)
-
这类头文件以相对不稳定的布局定义各种结构体。这些结构体中的一些是为了提供快速访问结构体组件而暴露,一些是因为历史原因而暴露。直接依赖这类头文件中的任何结构体都会破坏程序对其他版本 Libevent 的二进制兼容性,有时候是以非常难以调试的方式出现。这类头文件会以后缀“_struct.h”结尾。
(还存在一些不在 event2 目录中的较老版本 Libevent 的头文件,请参考下节:“如果你不得不使用一个老版本的 Libevent”)
如果你不得不使用一个老版本的 Libevent
Libevent 2.0以更合理的、不易出错的方式修正了API。如果可能,编写新程序时应该使用 Libevent 2.0。但是有时候可能需要同时支持较老的 API,要么是在升级已存在的应用程序时,或者支持因为某些原因不能安装2.0或者更新版本 Libevent 的环境时。
较老版本的 Libevent 头文件较少,也不安装在 event2 目录中:
旧的头文件… | …替换为当前版本的头文件 |
---|---|
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 才是线程安全的。
下面的一些章节还将讨论在特定代码库区域可能遇到的已经废弃的API。
关于版本状态的注意事项
1.4.7 及以前版本应该被认为是完全废弃的。1.3e 之前的版本应该被认为是无可救药的、且充满 bug 的。
(此外,不要向 Libevent 维护者发送任何关于 1.4.x 或者更早版本的新特征,这些版本被认为是稳定的发布版本。如果在 1.3x 或者更早版本中发现 bug,在报告之前请确定在最新的稳定发布版本中问题仍然存在:后续发布可能已经解决了问题。)
Last updated 2009-11-20 19:55:41 EDT