Libevent源码学习笔记一:event2/event.h
一、libevent标准使用方法:
每个程序使用Libevent必须include <event2/event.h> 头文件,并 传给 -levent 链接器。如果只是想使用主要的event和buffered IO-based code,不想链接任何协议代买,使用链接 -levent_core。
二、安装库设置
在调用Libevent其他函数时,需要设置库。例如在应用中使用多线程,需要先初始化线程支持,使用evthread_use_pthreads() or evthread_use_windows_threads().在<event2/thread.h>获取更多信息。
另外,可以使用event_set_mem_functions来替换Libevent 内存管理,想要测试 debug,使用event_enable_debug_mode().
三、 创建event base
Libevent是反应器(Reactor)模式,event_base就相当于反应器,event_base 负责监视event是等待状态还是就绪状态,每个event与一个event_base关联。
四、事件通知机制
一个文件描述符对应一个event结构体,可以使用event_new()来创建一个event结构体,或者是声明一个event structure,然后使用event_assign()来初始化event的成员。为了实现通知,使用event_add()来将事件添加到列表。只要事件是活动的,事件结构必须保持分配,因此它一般应该在堆上分配。
五、循环处理事件
最后调用event_base_dispatch() 来循环处理事件。也可以使用event_base_loop 来实现更细致的控制。
一个线程只能处理一个event_base。If you want to run events in multiple threads at once, you can either have a single event_base whose events add work to a work queue,or you can create multiple event_base objects.
六、bufferevent I/O Buffers 缓冲输入输出
Libevent提供 一个 buffered I/O abstraction 在常规事件回调的顶部。这个abstraction 是 bufferevent。一个 bufferevent 提供自动填充和清理输入和输出缓冲。使用buffered event不再直接处理I/O,而是从输入缓冲读,输出缓冲区写。
一旦通过bufferevent_socket_new()初始化,bufferevnet 结构体 通过bufferevent_enable()和bufferevent_diable()实现重复使用。以前是直接读写socket,使用bufferevent_socket后,改为使用bufferevent_read()和bufferevent_write()。
读缓存水位分析:
1、 bufferevent用于数据接收和发送缓存。
2、 bufferevent内建了两个struct bufferevent对象,分别用于发送和接收缓存。
3、 水位值用于实现对缓存区的管理。
4、 从网络模型分析bufferevent会自动从socket读取数据缓存在bufferevent的接收缓存中。
5、 当bufferevent存储的数据到达低水位值时读回调函数触发。
6、 低水位是0时,只要bufferevent从网络收数据就会触发读回调,也即数据可以立即被用户读走。
7、 读回调函数常规操作是从bufferevent中读取数据(用户读取数据)。
8、 但是当bufferevent读取的速度大于用户从bufferevent读取速度是,bufferevent中的数据量会达到高水位值。
9、 当bufferevent缓存数据量达到高水位值时,bufferevent会停止从网络接收数据。
10、当用户从bufferevent中读取了数据使水位值低于高水位值时,bufferevent又可以从网络中接收新的数据。
写缓存水位分析:
1、 用户先将数据写入到bufferevent发送缓存。
2、 当bufferevent发送缓存存储的数据量达到低水位时,回调函数将被触发。
3、 当低水位为0时,bufferevent缓存为空,写进数据时写回调被触发。
4、 回调函数的常规操作是将bufferevent发送缓存数据写到网络中。
5、 当用户写入发送缓存数据快于回调函数将数据写到网络中时,水位值将达到高水位值。
6、 高水位值没有使用。
七、定时器
Libevent可以创建定时器来当超时时来调用回调函数。evtimer_new() 宏 返回一个使用定时器的event。为了激活定时器,调用evtimer_add()宏。可以使用evtimer_del()使用定时器失活。
这些宏使用对event_new(),event_add(),event_del的包装。
八、evdns Asynchronous DNS resolution 异步DNS解决方案
Libevent 提供一个异步DNS来替代标准的DNS解决器。在<event2/dns.h>有更多函数
九、evhttp event-driven HTTP servers
Libevent提供一个非常简单事件驱动的HTTP服务器,可以集成到程序中并处理HTTP请求
<event2/http.h>
十、evrpc A framework for RPC servers and clients
Libevent provides a framework for creating RPC servers and clients. It takes care of marshaling and unmarshaling all data structures.
event2/event.h
The primary libevent header
十一、Libevent主要头文件
1.event2/thread.h
Functions for use by multithreaded programs
2.event2/buffer.h and event2/bufferevent.h
Buffer management for network reading and writing
3.event2/util.h
Utility functions for portable nonblocking network code
4.event2/dns.h
Asynchronous DNS resolution
5.event2/http.h
An embedded libevent-based HTTP server
6.event2/rpc.h
A framework for creating RPC servers and clients
十二、event structure
事件处理步骤:
1.event_new()创建event
2.event_add()将event添加到event_base中
3.不再使用事件时,event_free()删除事件
事件分为persistent和non-persistent。non-persistent事件,被触发后只执行一次,然后状态变为non-pending;persistent事件当被触发执行回调函数后,状态为pending然后在event_base继续等待执行,只用使用event_del()手动删除事件将状态改为non-pending。
Libevent源码学习笔记一:event2/event.h相关推荐
- Libevent 源码学习笔记(1)event 与 event_base
目录 event event_base eventop evcb_closure event_callback event_changelist evsig_info event_io_map eve ...
- Apache log4j-1.2.17源码学习笔记
(1)Apache log4j-1.2.17源码学习笔记 http://blog.csdn.net/zilong_zilong/article/details/78715500 (2)Apache l ...
- Java多线程之JUC包:Semaphore源码学习笔记
若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 文章目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目 ...
- Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)
在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...
- Vuex 4源码学习笔记 - Vuex是怎么与Vue结合?(三)
在上一篇笔记中:Vuex源码学习笔记 - Vuex开发运行流程(二) 我们通过运行npm run dev命令来启动webpack,来开发Vuex,并在Vuex的createStore函数中添加了第一个 ...
- jquery源码学习笔记三:jQuery工厂剖析
jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...
- 雷神FFMpeg源码学习笔记
雷神FFMpeg源码学习笔记 文章目录 雷神FFMpeg源码学习笔记 读取编码并依据编码初始化内容结构 每一帧的视频解码处理 读取编码并依据编码初始化内容结构 在开始编解码视频的时候首先第一步需要注册 ...
- PHP Yac cache 源码学习笔记
YAC 源码学习笔记 本文地址 http://blog.csdn.net/fanhengguang_php/article/details/54863955 config.m4 检测系统共享内存支持情 ...
最新文章
- 【Verilog HDL 训练】第 02 天
- 你是一个职业的页面重构工作者吗?
- 线性结构--离散存储 链表讲解
- FPS手游《战地先锋》性能案例精讲
- C语言 | C51实现NRF905收发设计(完整源代码)
- DeVOpS 实战:Kubernetes 微服务监控体系
- 14 [虚拟化] 虚存抽象;Linux进程的地址空间
- 30 PP配置-生产车间控制-定义计划策略
- 三角形旋转c语言程序,c语言图形,请高手修改,效果是一个三角形绕一点旋转一周...
- L2-020. 功夫传人(STL+深搜)
- win10系统无法删除文件提示找不到该项目解决办法
- springboot读取resources目录下文件
- CSDN怎么下载文件
- Python绘制3D立体花
- C语言字母常量所对应的数字,关于c语言常量的正确表示方法介绍
- shell命令之ln
- 国家网络安全周|2022网络安全知识答题
- ant-design中Input输入框在获取焦点时由于保留了上次输入内容而莫名出现了一个黑色背景的选择提示框,且选择提示框中的值后还会出现蓝色背景
- 苹果系统代码汉字转拼音
- 基于KCOM3模块编写脚本控制电脑键盘鼠标,附控制软件