logo资料库

libevent参考手册(中文版)_libevent-2.1.5-beta.pdf

第1页 / 共145页
第2页 / 共145页
第3页 / 共145页
第4页 / 共145页
第5页 / 共145页
第6页 / 共145页
第7页 / 共145页
第8页 / 共145页
资料共145页,剩余部分请下载后查看
1.关于本文档
2.示例代码注意事项
3.一个小的异步IO例子
3.1怎样才能更方便?(Windows下怎么弄)
3.2这一切效率如何,当真?
4.正文前页
4.1从1000英尺看LibEvent
4.2库
4.3头文件
4.4如果需要使用老版本libevent
4.4.1版本状态告知
5.设置LibEvent库
5.1LibEvent日志消息
5.2处理致命错误
5.3内存管理
5.4线程和锁
5.5 调试锁的使用
5.6调试事件使用
5.7检查LibEvent的版本信息
5.8释放LibEvent全局结构体
6.创建Event_base
6.1创建默认的Event_base
6.2创建复杂的Event_base
6.3检查Event_base的后台方法
6.4重新分配一个Event_base
6.5设置Event_base优先级
6.6Fork()之后重新初始化一个Event_base
6.7废弃的Event_base函数
7.事件循环
7.1运行循环
7.2停止循环
7.3检查事件
7.4检查内部时间缓存
7.5转存Event_base状态
7.6每个event_base上运行一个event
7.7废弃的事件回调函数
8.处理事件
8.1 构造事件对象
8.1.1事件标志
8.1.2关于事件持久性
8.1.3创建一个用本身作为回调函数参数的event
8.1.4超时事件
8.1.5构造信号事件
8.1.6不用堆分配来设置事件
8.2使事件未决和非未决
8.3事件优先级
8.4检查事件状态
8.5查找当前运行事件
8.6配置一次性事件
8.7手动激活事件
8.8优化通用超时
8.9从已清除的内存中识别事件
8.10废弃的事件操作函数
9.辅助类型和函数
9.1基本类型
9.1.1Evuitl_socket_t
9.1.2标准整数类型
9.1.3各种兼容性类型
9.2定时器可移植函数
9.3套接字API兼容性
9.4可移植的字符串操作函数
9.5区域无关的字符串操作函数
9.6IPv6 辅助和兼容性函数
9.7结构体可移植函数
9.8安全随机数发生器
10.Bufferevent 概念和入门
10.1Bufferevent 和Evbuffer
10.2 回调和水位
10.3延迟回调
10.4Bufferevent的选项标志
10.5与套接字的Bufferevent一起工作
10.5.1创建基于套接字的Eventbuffer
10.5.2在套接字的Bufferevent上启动连接
10.5.3通过主机名启动连接
10.6通用Bufferevent操作
10.6.1释放Bufferevent
10.6.2操作回调、水位、启用、禁用
10.6.3操作Bufferevent中的数据
10.6.4读写超时
10.6.5对Bufferevent发起清空操作
10.7类型特定的Bufferevent函数
10.8手动锁定和解锁
10.9已废弃的Bufferevent功能
11.高级话题
11.1成对的Bufferevent
11.2过滤Bufferevent
11.3限制最大单个读写大小
11.4Bufferevent和速率限制
11.4.1速率限制模型
11.4.2为Bufferevent设置速率限制
11.4.3为一组Eventbuffer设置速率限制
11.4.4检查当前速率限制
11.4.5手动调整速率限制
11.4.6设置速率限制组的最小可能共享
11.4.7 速率限制实现的限制
11.5Bufferevent和SSL
11.5.1创建和使用基于SSL的Bufferevent
11.5.2线程和OpenSSL的一些说明
12.Evbuffer IO实用功能
12.1创建或释放一个Bvbuffer
12.2Evbuffer和线程安全
12.3检查Evbuffer
12.4向Evbuffer添加数据:基础
12.5将数据从一个Evbuffer移动到另一个
12.6添加数据到Evbuffer的前面
12.7重新排列Evbuffer的内部布局
12.8从evbuffer移除数据
12.9从Evbuffer中复制出数据
12.10面向行的输入
12.11在Evbuffer中搜索
12.12检测数据而不复制
12.13直接向Evbuffer添加数据
12.14使用Evbuffer的网络IO
12.15Evbuffer和回调
12.16为基于evbuffer的IO避免数据复制
12.17增加一个文件到Evbuffer
12.18细粒度控制文件段
12.19添加一个Evbuffer引用到另一个Evbuffer
12.20让Evbuffer只能添加和删除
12.21废弃的Evbuffer函数
13.连接监听器:接受一个TCP连接
13.1创建或释放一个evconnlistener
13.1.1可识别的标志
13.1.2连接监听器回调
13.2启用和禁用evconnlistener
13.3调整evconnlistener的回调函数
13.4检查evconnlistener
13.5检查错误
13.6示例程序:一个echo服务器
14.使用LibEvent的DNS:高和低层功能
14.1正文前页:可移植的阻塞式名称解析
14.2使用 evdns_getaddrinfo()进行非阻塞名字解析
14.3创建和配置evdns_base
14.3.1使用系统配置初始化evdns
14.3.2手动配置evdns
14.3.3库端配置
15.底层DNS接口
15.1挂起DNS客户端操作,更换名字服务器
16.DNS服务器接口
16.1创建和关闭DNS服务器
16.2检测DNS请求
16.3响应DNS请求
16.4DNS服务器示例
17.废弃的DNS接口
18.LibEvent编程示例
18.1Event客户端服务器示例
18.1.1客户端
18.1.2服务器端
18.1.3编译源码
18.1.4脚本文件
18.1.4运行测试
18.2BufferEvent客户端服务器示例
18.2.1客户端
18.2.2服务器端
18.2.3编译源码
18.2.4脚本文件
18.2.4运行测试
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
分享到:
收藏