没有合适的资源?快使用搜索试试~ 我知道了~
首页libevent参考手册(中文版).pdf
libevent参考手册(中文版).pdf

libevent参考手册(中文版):比较详细的介绍了libevent网络编程。
资源详情
资源评论
资源推荐

原创: http://blog.sina.com.cn/yaozj
整理: http://yaocoder.blog.51cto.com/
前言
翻译自: http://www.wangafu.net/~nickm/libevent-book/Ref0_meta.html
1
1
1
1 .
.
.
. 从一万英尺外看 Libevent
Libevent
Libevent
Libevent
Libevent 是用于编写高速可移植非阻塞 IO 应用的库,其设计目标是:
�
可移植性 : 使用 libevent 编写的程序应该可以在 libevent 支持的所有平台上工作 。 即使
没有好的方式进行非阻塞 IO , libevent 也应该支持一般的方式 , 让程序可以在受限的环
境中运行。
� 速度: libevent 尝试使用每个平台上最高速的非阻塞 IO 实现,并且不引入太多的额外
开销。
� 可扩展性: libevent 被设计为程序即使需要上万个活动套接字的时候也可以良好工作 。
� 方便:无论何时,最自然的使用 libevent 编写程序的方式应该是稳定的、可移植的。
libevent 由下列组件构成:
� evutil :用于抽象不同平台网络实现差异的通用功能。
� event 和 event_base : libevent 的核心,为各种平台特定的、基于事件的非阻塞 IO 后
端提供抽象 API , 让程序可以知道套接字何时已经准备好 , 可以读或者写 , 并且处理基
本的超时功能,检测 OS 信号。
�
bufferevent : 为 libevent 基于事件的核心提供使用更方便的封装 。 除了通知程序套接字
已经准备好读写之外 , 还让程序可以请求缓冲的读写操作 , 可以知道何时 IO 已经真正
发生 。 ( bufferevent 接口有多个后端 , 可以采用系统能够提供的更快的非阻塞 IO 方式
,
如 Windows 中的 IOCP 。 )
�
evbuffer :在 bufferevent 层之下实现了缓冲功能,并且提供了方便有效的访问函数。
� evhttp :一个简单的 HTTP 客户端 / 服务器实现。
� evdns :一个简单的 DNS 客户端 / 服务器实现。
�
evrpc :一个简单的 RPC 实现。

2
2
2
2 .
.
.
. 库
创建 libevent 时,默认安装下列库:
�
ibevent_core :所有核心的事件和缓冲功能,包含了所有的 event_base 、 evbuffer 、
bufferevent 和工具函数。
� ibevent_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 , 除非是
进行加密通信。
3
3
3
3 .
.
.
. 头文件
libevent 公用头文件都安装在 event2 目录中,分为三类:
�
API 头文件:定义 libevent 公用接口。这类头文件没有特定后缀。
� 兼容头文件 : 为已废弃的函数提供兼容的头部包含定义 。 不应该使用这类头文件 , 除非
是在移植使用较老版本 libevent 的程序时。
� 结构头文件 : 这类头文件以相对不稳定的布局定义各种结构体 。 这些结构体中的一些是
为了提供快速访问而暴露 ; 一些是因为历史原因而暴露 。 直接依赖这类头文件中的任何
结构体都会破坏程序对其他版本 libevent 的二进制兼容性 , 有时候是以非常难以调试的
方式出现。这类头文件具有后缀 “ _struct.h ” 。
(还存在不在 event2 目录中的较老版本 libevent 的头文件,请参考下节:如果需要使用老
版本 libevent )
4
4
4
4 .
.
.
. 如果需要使用老版本 libevent
libevent
libevent
libevent
libevent 2.0 以更合理的、不易出错的方式修正了 API 。如果可能,编写新程序时应该使 用
libevent 2.0 。 但是有时候可能需要使用较老的 API , 例如在升级已存的应用时 , 或者支持因

为某些原因不能安装 2.0 或者更新版本 libevent 的环境时。
较老版本的 libevent 头文件较少,也不安装在 event2 目录中。
在 2.0 以及以后版本的 libevent 中,老的头文件仍然会作为新头文件的封装而存在。
其他关于使用较老版本的提示:
�
1.4 版之前只有一个库 libevent ,它包含现在分散到 libevent_core 和 libevent_extra 中
的所有功能。
�
2.0 版之前不支持锁定:只有确定不同时在多个线程中使用同一个结构体时, libeven t
才是线程安全的。
下面的节还将讨论特定代码区域可能遇到的已经废弃的 API 。
5
5
5
5 .
.
.
. 关于版本状态的提示
1.4.7 及以前版本应该被认为是完全废弃的。 1.3 之前的版本应该被认为是充满 bug 的。
(此外,不要向 libevent 维护者发送任何关于 1.4.x 或者更早版本的新特征,这些版本被认
为是稳定的发布版本。如果在 1.3x 或者更早版本中发现 bug ,在报告之前请确定在最新的
稳定发布版本中问题仍然存在:后续发布可能已经解决了问题 。 )

第一章:设置 libevent
libevent
libevent
libevent
翻译自: http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html
libevent 有一些被整个进程共享的 、 影响整个库的全局设置 。 必须在调用 libevent 库的任何
其他部分之前修改这些设置,否则, libevent 会进入不一致的状态。
1
1
1
1 .
.
.
. Libevent
Libevent
Libevent
Libevent 中的日志消息
libevent 可以记录内部错误和警告 。 如果编译进日志支持 , 还会记录调试信息 。 默认配置下
这些信息被写到 stderr 。通过提供定制的日志函数可以覆盖默认行为。
接口
要覆盖 libevent 的日志行为,编写匹配 event_log_cb 签名的定制函数,将其作为参数传递
给 event_set_log_callback ( ) 。随后 libevent 在日志信息的时候,将会把信息传递给你提
供的函数。再次调用 event_set_log_callback ( ) ,传递参数 NULL ,就可以恢复默认行为 。
示例
…… 省略示例代码 ……
注意
在用户提供的 event_log_cb 回调函数中调用 libevent 函数是不安全的。比如说,如果试图
编写一个使用 bufferevent 将警告信息发送给某个套接字的日志回调函数,可能会遇到奇怪
而难以诊断的 bug 。未来版本 libevent 的某些函数可能会移除这个限制。
这个函数在 <event2/event.h> 中声明,在 libevent 1.0c 版本中首次出现。

2
2
2
2 .
.
.
. 处理致命错误
libevent 在检测到不可恢复的内部错误时的默认行为是调用 exit ()或者 abort ( ) ,退出正
在运行的进程。这类错误通常意味着某处有 bug :要么在你的代码中,要么在 libevent 中 。
如果希望更优雅地处理致命错误 , 可以为 libevent 提供在退出时应该调用的函数 , 覆盖默认
行为。
接口
要使用这些函数,首先定义 libevent 在遇到致命错误时应该调用的函数,将其传递 给
event_set_fatal_callback ( ) 。随后 libevent 在遇到致命错误时将调用你提供的函数。
你的函数不应该将控制返回到 libevent :这样做可能导致不确定的行为。为了避免崩溃,
libevent 还是会退出。你的函数被不应该调用其它 libevent 函数。
这些函数声明在 <event2/event.h> 中,在 libevent 2.0.3-alpha 版本中首次出现。
3
3
3
3 .
.
.
. 内存管理
默认情况下 , libevent 使用 C 库的内存管理函数在堆上分配内存 。 通过提供 malloc 、 reallo c
和 free 的替代函数,可以让 libevent 使用其他的内存管理器。希望 libevent 使用一个更高
效的分配器时 ; 或者希望 libevent 使用一个工具分配器 , 以便检查内存泄漏时 , 可能需要这
样做。
接口
这里有个替换 libevent 分配器函数的示例 , 它可以计算已经分配的字节数 。 实际应用中可能
需要添加锁,以避免运行在多个线程中时发生错误。
示例
…… 省略示例代码 ……
剩余125页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论10