Libevent
快速可移植非阻塞式网络编程
版本 日期
V1.0
2016-11-15 周勇 Libevent 编程中文帮助
修订历史
作者 备注
文档
本 文 档 是 2009-2012 年 由 Nick-Mathewson 基 于 Attribution-Noncommercial-Share
Alike 许可协议 3.0 创建,未来版本将会使用约束性更低的许可来创建.
此外,本文档的源代码示例也是基于 BSD 的"3 条款"或"修改"条款.详情请参考 BSD
文件全部条款.本文档最新下载地址:
英文:http://libevent.org/
中文:http://blog.csdn.net/zhouyongku/article/details/53431597
请下载并运行"gitclonegit://github.com/nmathewson/libevent- book.git"获取本文档描
述的最新版本源码.
1.关于本文档................................................................................................................................................................................ 6
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku
2.示例代码注意事项....................................................................................................................................................................6
3.一个小的异步 IO 例子.............................................................................................................................................................. 6
3.1 怎样才能更方便?(Windows 下怎么弄)....................................................................................................................22
3.2 这一切效率如何,当真?..............................................................................................................................................25
4.正文前页.................................................................................................................................................................................. 25
4.1 从 1000 英尺看 LibEvent..............................................................................................................................................25
4.2 库................................................................................................................................................................................... 26
4.3 头文件...........................................................................................................................................................................26
4.4 如果需要使用老版本 libevent.................................................................................................................................... 26
4.4.1 版本状态告知....................................................................................................................................................27
5.设置 LibEvent 库...................................................................................................................................................................... 27
5.1LibEvent 日志消息.........................................................................................................................................................27
5.2 处理致命错误...............................................................................................................................................................29
5.3 内存管理.......................................................................................................................................................................29
5.4 线程和锁.......................................................................................................................................................................32
5.5 调试锁的使用...............................................................................................................................................................34
5.6 调试事件使用...............................................................................................................................................................35
5.7 检查 LibEvent 的版本信息...........................................................................................................................................36
5.8 释放 LibEvent 全局结构体...........................................................................................................................................38
6.创建 Event_base...................................................................................................................................................................... 39
6.1 创建默认的 Event_base...............................................................................................................................................39
6.2 创建复杂的 Event_base...............................................................................................................................................39
6.3 检查 Event_base 的后台方法......................................................................................................................................42
6.4 重新分配一个 Event_base...........................................................................................................................................43
6.5 设置 Event_base 优先级..............................................................................................................................................43
6.6Fork()之后重新初始化一个 Event_base...................................................................................................................... 44
6.7 废弃的 Event_base 函数..............................................................................................................................................45
7.事件循环.................................................................................................................................................................................. 45
7.1 运行循环.......................................................................................................................................................................45
7.2 停止循环.......................................................................................................................................................................46
7.3 检查事件.......................................................................................................................................................................48
7.4 检查内部时间缓存.......................................................................................................................................................48
7.5 转存 Event_base 状态..................................................................................................................................................48
7.6 每个 event_base 上运行一个 event........................................................................................................................... 49
7.7 废弃的事件回调函数...................................................................................................................................................49
8.处理事件.................................................................................................................................................................................. 49
8.1 构造事件对象...............................................................................................................................................................50
8.1.1 事件标志............................................................................................................................................................51
8.1.2 关于事件持久性................................................................................................................................................51
8.1.3 创建一个用本身作为回调函数参数的 event................................................................................................ 52
8.1.4 超时事件............................................................................................................................................................52
8.1.5 构造信号事件....................................................................................................................................................53
8.1.6 不用堆分配来设置事件....................................................................................................................................54
8.2 使事件未决和非未决...................................................................................................................................................56
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku
8.3 事件优先级...................................................................................................................................................................57
8.4 检查事件状态...............................................................................................................................................................57
8.5 查找当前运行事件.......................................................................................................................................................59
8.6 配置一次性事件...........................................................................................................................................................59
8.7 手动激活事件...............................................................................................................................................................59
8.8 优化通用超时...............................................................................................................................................................61
8.9 从已清除的内存中识别事件.......................................................................................................................................62
8.10 废弃的事件操作函数.................................................................................................................................................63
9.辅助类型和函数......................................................................................................................................................................64
9.1 基本类型.......................................................................................................................................................................64
9.1.1Evuitl_socket_t....................................................................................................................................................64
9.1.2 标准整数类型....................................................................................................................................................64
9.1.3 各种兼容性类型................................................................................................................................................65
9.2 定时器可移植函数.......................................................................................................................................................65
9.3 套接字 API 兼容性....................................................................................................................................................... 66
9.4 可移植的字符串操作函数...........................................................................................................................................67
9.5 区域无关的字符串操作函数.......................................................................................................................................68
9.6IPv6 辅助和兼容性函数................................................................................................................................................68
9.7 结构体可移植函数.......................................................................................................................................................69
9.8 安全随机数发生器.......................................................................................................................................................69
10.Bufferevent 概念和入门........................................................................................................................................................70
10.1Bufferevent 和 Evbuffer...............................................................................................................................................70
10.2 回调和水位.................................................................................................................................................................70
10.3 延迟回调.....................................................................................................................................................................71
10.4Bufferevent 的选项标志............................................................................................................................................. 71
10.5 与套接字的 Bufferevent 一起工作........................................................................................................................... 72
10.5.1 创建基于套接字的 Eventbuffer..................................................................................................................... 72
10.5.2 在套接字的 Bufferevent 上启动连接............................................................................................................72
10.5.3 通过主机名启动连接......................................................................................................................................74
10.6 通用 Bufferevent 操作............................................................................................................................................... 75
10.6.1 释放 Bufferevent............................................................................................................................................. 75
10.6.2 操作回调、水位、启用、禁用..................................................................................................................... 76
10.6.3 操作 Bufferevent 中的数据............................................................................................................................ 78
10.6.4 读写超时..........................................................................................................................................................80
10.6.5 对 Bufferevent 发起清空操作........................................................................................................................ 80
10.7 类型特定的 Bufferevent 函数................................................................................................................................... 81
10.8 手动锁定和解锁.........................................................................................................................................................82
10.9 已废弃的 Bufferevent 功能....................................................................................................................................... 82
11.高级话题................................................................................................................................................................................ 83
11.1 成对的 Bufferevent.................................................................................................................................................... 83
11.2 过滤 Bufferevent........................................................................................................................................................ 84
11.3 限制最大单个读写大小.............................................................................................................................................85
11.4Bufferevent 和速率限制............................................................................................................................................. 86
11.4.1 速率限制模型..................................................................................................................................................86
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku
11.4.2 为 Bufferevent 设置速率限制........................................................................................................................ 86
11.4.3 为一组 Eventbuffer 设置速率限制................................................................................................................ 87
11.4.4 检查当前速率限制..........................................................................................................................................87
11.4.5 手动调整速率限制..........................................................................................................................................88
11.4.6 设置速率限制组的最小可能共享................................................................................................................. 88
11.4.7 速率限制实现的限制.....................................................................................................................................89
11.5Bufferevent 和 SSL....................................................................................................................................................... 89
11.5.1 创建和使用基于 SSL 的 Bufferevent..............................................................................................................89
11.5.2 线程和 OpenSSL 的一些说明......................................................................................................................... 93
12.Evbuffer IO 实用功能.............................................................................................................................................................94
12.1 创建或释放一个 Bvbuffer..........................................................................................................................................94
12.2Evbuffer 和线程安全...................................................................................................................................................94
12.3 检查 Evbuffer..............................................................................................................................................................94
12.4 向 Evbuffer 添加数据:基础........................................................................................................................................95
12.5 将数据从一个 Evbuffer 移动到另一个.....................................................................................................................95
12.6 添加数据到 Evbuffer 的前面.....................................................................................................................................96
12.7 重新排列 Evbuffer 的内部布局.................................................................................................................................96
12.8 从 evbuffer 移除数据.................................................................................................................................................97
12.9 从 Evbuffer 中复制出数据.........................................................................................................................................97
12.10 面向行的输入...........................................................................................................................................................98
12.11 在 Evbuffer 中搜索...................................................................................................................................................99
12.12 检测数据而不复制.................................................................................................................................................101
12.13 直接向 Evbuffer 添加数据.....................................................................................................................................103
12.14 使用 Evbuffer 的网络 IO........................................................................................................................................ 105
12.15Evbuffer 和回调.......................................................................................................................................................105
12.16 为基于 evbuffer 的 IO 避免数据复制...................................................................................................................107
12.17 增加一个文件到 Evbuffer......................................................................................................................................109
12.18 细粒度控制文件段.................................................................................................................................................109
12.19 添加一个 Evbuffer 引用到另一个 Evbuffer..........................................................................................................110
12.20 让 Evbuffer 只能添加和删除.................................................................................................................................111
12.21 废弃的 Evbuffer 函数.............................................................................................................................................111
13.连接监听器:接受一个 TCP 连接........................................................................................................................................ 112
13.1 创建或释放一个 evconnlistener............................................................................................................................. 112
13.1.1 可识别的标志................................................................................................................................................113
13.1.2 连接监听器回调............................................................................................................................................113
13.2 启用和禁用 evconnlistener......................................................................................................................................113
13.3 调整 evconnlistener 的回调函数............................................................................................................................ 114
13.4 检查 evconnlistener..................................................................................................................................................114
13.5 检查错误...................................................................................................................................................................114
13.6 示例程序:一个 echo 服务器....................................................................................................................................114
14.使用 LibEvent 的 DNS:高和低层功能.................................................................................................................................116
14.1 正文前页:可移植的阻塞式名称解析..................................................................................................................... 116
14.2 使用 evdns_getaddrinfo()进行非阻塞名字解析.................................................................................................... 119
14.3 创建和配置 evdns_base.......................................................................................................................................... 122
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku
14.3.1 使用系统配置初始化 evdns.........................................................................................................................122
14.3.2 手动配置 evdns............................................................................................................................................. 124
14.3.3 库端配置........................................................................................................................................................124
15.底层 DNS 接口..................................................................................................................................................................... 125
15.1 挂起 DNS 客户端操作,更换名字服务器................................................................................................................ 127
16.DNS 服务器接口..................................................................................................................................................................127
16.1 创建和关闭 DNS 服务器..........................................................................................................................................127
16.2 检测 DNS 请求..........................................................................................................................................................128
16.3 响应 DNS 请求..........................................................................................................................................................128
16.4DNS 服务器示例........................................................................................................................................................130
17.废弃的 DNS 接口.................................................................................................................................................................132
18.LibEvent 编程示例...............................................................................................................................................................133
18.1Event 客户端服务器示例......................................................................................................................................... 133
18.1.1 客户端............................................................................................................................................................133
18.1.2 服务器端........................................................................................................................................................135
18.1.3 编译源码........................................................................................................................................................137
18.1.4 脚本文件........................................................................................................................................................137
18.1.4 运行测试........................................................................................................................................................138
18.2BufferEvent 客户端服务器示例............................................................................................................................... 139
18.2.1 客户端............................................................................................................................................................139
18.2.2 服务器端........................................................................................................................................................141
18.2.3 编译源码........................................................................................................................................................144
18.2.4 脚本文件........................................................................................................................................................144
18.2.4 运行测试........................................................................................................................................................144
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku
1.关于本文档
为了更好掌握 Libevent(2.0)进行快速可移植的异步 IO 网络编程,你需要具备:
C 语言基本知识
C 语言网络开发函数调用(socket(),connect()等).
2.示例代码注意事项
本文档描述的源码示例需要运行在 Linux、FreeBSD、OpenBSD、NetBSD、MacOSX、Solaris、Android 这些操作系统
中,而 Windows 环境下编译可能会有一些不兼容的情况发生.
3.一个小的异步 IO 例子
许多初学者往往都是使用阻塞式 IO 调用进行编程.当你调用一个同步 IO 的时候,除非操作系统已经完成了操作或者
时间长到你的网络堆栈放弃的时候,否则系统是不会返回完成的.举个例子,当你调用"connect"做一个 TCP 连接的时候,
你的操作系统必须排队处理来自发送到服务器的 SYN 包,除非等到 SYN_ACK 包从对面接收到,或者是超时,否则操作
是不会返回给你的应用程序.
第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认;SYN:同步序列编
号(Synchronize Sequence Numbers).第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一
个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;第三次握手:客户端收到服务器的 SYN+ACK 包,向服
务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手.
TCP 三次握手
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku
这里有一个很简单的阻塞式网络调用的例子,它打开一个连接到 www.google.com,发送它简单的 HTTP 请求,并打印输
出到 stdout.
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku
示例:一个简单的阻塞式 HTTP 客户端
/* For sockaddr_in*/
#include
/* For socket functions*/
#include
/* For gethostbyname*/
#include
#include
#include
#include
int main(int c, char** v)
{
const char query[] =
"GET / HTTP/1.0\r\n"
"Host: www.google.com\r\n"
"\r\n";
const char hostname[] = "www.google.com";
struct sockaddr_in sin;
struct hostent* h;
const char* cp;
int fd;
ssize_t n_written, remaining;
char buf[1024];
/* Look up the IP address for the hostname. Watch out; this isn’t
threadsafe on most platforms.*/
h = gethostbyname(hostname);
if (!h) {
fprintf(stderr, "Couldn’t lookup %s: %s", hostname,
}
if (h->h_addrtype != AF_INET) {
return 1;
fprintf(stderr, "No ipv6 support, sorry.");
return 1;
}
/* Allocate a new socket*/
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
perror("socket");
return 1;
}
/* Connect to the remote host*/
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sin.sin_addr =
* (struct in_addr * )h->h_addr;
if (connect(fd, (struct sockaddr * ) &sin, sizeof(sin))) {
hstrerror(h_errno));
perror("connect");
close(fd);
return 1;
}
/* Write the query.*/
/* XXX Can send succeed partially?*/
cp = query;
remaining = strlen(query);
LibEvent 编程中文帮助文档
http://blog.csdn.net/zhouyongku