【libevent】libevent库学习总结(一)——基础
libevent库学习总结(一)——基础
一、基础
1.1、 介绍
Libevent是一个用于开发可伸缩网络服务器的事件通知库。Libevent API提供了一种机制来执行回调函数,当某个特定事件发生在文件描述符上或超时到达之后。此外,Libevent还支持信号或定期超时的回调。
Libevent的目的是取代在事件驱动的网络服务器中发现的事件循环。应用程序只需调用eventbasedispatch()(p122),然后动态地添加或删除事件,而无需更改事件循环。
目前Libevent支持 /dev/poll, kqueue(2), select(2), poll(2), epoll(4), and evports。内部事件机制完全独立于公开的事件API,而Libevent的简单更新无需重新设计应用程序就可以提供新的功能。因此,Libevent允许可移植的应用程序开发,并提供了一个操作系统上可用的最可伸缩的事件通知机制。Libevent也可以用于多线程程序。Libevent可以在Linux、BSD、Mac OS X、Solaris和Windows上编译。
1.2、 规范用法
使用Libevent的每个程序都必须包括 < event2/event.h (p.108) >,并将-levent标志传递给链接器。(如果您只想要主事件,并缓冲 IO-based的代码,而不希望链接任何协议代码,则可以链接-leventcore。)
1.3、 库设置
在调用任何其他Libevent函数之前,需要设置这个库。如果要在多线程应用程序的多个线程中使用Libevent,则需要初始化对线程的支持——使用evthread_use_pthreads() (p.203)or evthread_use_windows_threads() (p.203)。参见< event2/thread.h (p.199) >
可以用event_set_mem_functions替换Libevent的内存管理功能;使用 event_enable_debug_mode() (p.136)来启用调试模式。
1.4、 创建一个基础事件(event base)
使用event_base_new()(p.129) 或者 event_base_new_with_config() (p.130)来创建一个event_base (p.17) 结构体。eventbase(p.17)负责跟踪哪些事件是“待处理的”以及哪些事件是“活动的”。每个事件都与单个event_base(p.17)相关联。
1.5、 事件通知
对于希望监视的每个文件描述符,必须使用event_new() (p.139)创建一个event结构体。(您还可以声明一个event结构体,并调用event_assign() (p.121)来初始化该结构体的成员。想要使能通知,您可以通过调用 event_add() (p.120)将该结构体添加到监视事件的列表中。event结构体必须在活动时保持分配,因此通常应该在堆上分配它。
1.6、 事件调度
最后,使用event_base_dispatch() (p.122)来循环和调度事件。可以使用event_base_loop() (p.127)来获取更细粒度的控制。(细粒度控制是将业务模型中的对象加以细分,从而得到更科学合理的对象模型,直观的说就是划分出很多对象。)
如果只有一个线程可以一次调度一个给定的event_base (p.17)。如果想同时在多个线程中运行多个事件,可以有一个单独的event_base (p.17),event_base中的事件将工作添加到一个工作队列中,或者可以创建多个event_base (p.17)对象。
1.7、I/O缓冲
1.7.1、Libevent在常规的事件回调之上提供了一个缓冲的输入/输出。这个抽象称为bufferevent。bufferevent提供输入和输出缓冲区,这些缓冲区被自动填充和流出。缓冲事件的用户不再直接处理输入输出,而是从输入和写入输出缓冲区中读取数据。
1.7.2、通过bufferevent_socket_new() (p.76)来初始化bufferevent结构体。
1.7.3、使用 bufferevent_enable() (p.65) 和bufferevent_disable() (p.65)来使能和禁止使用 I/O缓冲。
1.7.4、使用 bufferevent_read()(p.71) 和bufferevent_write() (p.77)来代替对socket的直接读写。
1.7.5、 当可以读取时,bufferevent将尝试从文件描述符读取并调用读取回调。当输出缓冲区空时,写回调就会被执行,而在默认情况下是0。
1.8、 定时器
Libevent还可以用于创建计时器,时间过期后调用回调。 evtimer_new()宏返回一个event结构体,用作定时器。使用evtimer_add()来激活计时器。计时器可以通过调用evtimer_del()来关闭。(这些宏都是event_new()(p 139)、event_add()(第120)和event_del(第135页)的简单封装。)
1.9、DNS异步解析
Libevent提供了一个异步的DNS解析器,它可以代替非标准的DNS解析器函数。详见 < event2/dns.h (p.81) >。
1.10、事件驱动型的HTTP服务器
Libevent提供了一个非常简单的事件驱动型的HTTP服务器,它可以嵌入到您的程序中,并用于服务HTTP请求。
需要添加头文件 < event2/http.h (p.147) >。
1.11、RPC服务器和客户机的框架
Libevent为创建RPC服务器和客户端提供了一个框架。它负责封送和解封所有的数据结构。
1.12、头文件
- event2/event.h (p.108) libevent的主头文件
- event2/thread.h (p.199) 用于多线程程序
- event2/buffer.h (p.25) event2/bufferevent.h (p.54) 读写的缓冲区管理
- event2/util.h (p.203)可移植的非阻塞网络代码的实用功能
- event2/dns.h (p.81) DNS异步解析
- event2/http.h (p.147) 嵌入式HTTP服务器
- event2/rpc.h (p.181) 创建RPC服务器和客户机的框架
相关文章:

AS1.0(2.0)中的XML示例
虽然Flash早就升级为AS3.0,但是FMS的服务端编程依然仅支持AS1.0(2.0),服务端与.net通讯的最简单方式莫过于请求一个RESTful的webService或wcf,通过它们返回的xml来获取数据。 var _xml:XML new XML("<ArrayOfstring xmlns\"htt…

【Qt】Qt发布可执行程序(打包依赖库)
Qt发布可执行程序(打包依赖库) 0、编译出可执行文件 如:xxx.exe 1、将xxx.exe拷贝到一个目录下面 2、启动Qt终端交互界面程序 如:Qt 5.6 for Desktop(MinGW) 3、进入xxx.exe所在的目录 4、执行命令…

小编说之“常见问题答疑”
2019独角兽企业重金招聘Python工程师标准>>> 关于前嗅Forespider爬虫的常见问题答疑 奋战在一线为客户答疑的狗蛋儿给小编提供了很多客户经常会问到的问题的素材,小编帮大家整理了一些,快来看看是不是都用的上吧! 一、采集预览没有…

给AI开发者的新年礼物,技术公开课大放送(附演讲PPT)
各位AI科技大本营的伙伴大家好,营长携编辑组的全体成员给大家拜年了! 新年新思!新一年,每个人的梦想都闪耀着多彩光芒,对于AI领域的每一位学习者和从业者,我们充满渴望,怀揣梦想,心系…

通用权限管理组件使用说明书V3.0 错误校正 感谢自由软件职业者Helper(767870484)...
有时候,真想做个像样的东西出来,但是往往各方面的能力都不够,这么多人,Helper(767870484)仔细认真的阅读了这个帮助手册、并给给于了指正,在这里非常感谢,你的劳动成果已经被通用权限…

Reddit欲融资3亿美元,由腾讯领投
整理 | 一一出品 | AI科技大本营(ID:rgznai100)AI科技大本营消息,据 TechCrunch 报道,多个信源透露,美国社交网站 Reddit 将融资 1.5 亿到 3 亿美元,D 轮融资将由中国科技巨头腾讯公司领投,投前…

【libevent】libevent库学习总结(二)——编程步骤
一、libevent编程步骤 0、分配并初始化event_base,两种方法 0.1 event_base_new:线程安全,代替event_init; 0.2 event_init:线程不安全,不推荐使用,仅仅是为了向后兼容 1、创建event…

HP交换机配置命令
1.命名hostname 7-West-4F-2510 2.设置管理IPvlan 1ip address 192.168.41.123 255.255.255.03.修改支持的默认vlan数max-vlans 64max-vlans //修改vlan的数量,默认只有8个,修改后需重启后才可生效4.重启reload //重启交换机5.配置v…

【Qt】Qt程序编译成功,执行时报错:程序异常结束,crashed
【Qt】Qt程序编译成功,执行时报错:程序异常结束,crashed 错误打印信息 Starting E:*exe… 程序异常结束。 E:*.exe crashed. 原因 使用到外部库,编译时,指定了库连接,但是在程序运行时找不到库…

近900000条if-then关系图谱,让神经网络“懂”常识推理
编译整理 | 一一出品 | AI科技大本营(ID:rgznai100)“神经网络能学习日常事件的常识推理吗?能,如果在 ATOMIC 上训练的话。”ATOMIC(原子) 是一个机器常识图集,一个用自然语言建立的 870, 000 个…

weex 阶段总结
新年伊始,回顾过去的一年,收获很多,之前一直在研究weex,说心里话感觉心好累,官方文档不全,社区不活跃,遇到很多坑,官方发布的版本有时都有坑,搞得我都不敢更新版本了。 但…

DOS批处理高级教程精选(六)
为什么80%的码农都做不了架构师?>>> 第五章 set命令详解 很久没发贴了,今天来写点讲BAT的新手教学贴! 在上一贴中我简单的介绍了一下SET设置自定义变量的作用,现在我来具体讲一下set的其他功能. 一、用set命令设置自定义变量 显示、设置或删除 cmd.exe …

8.11. Migrating MySQL Data into Elasticsearch using logstash
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html 8.11.1. 安装 logstash 安装 JDBC 驱动 和 Logstash curl -s https://raw.githubusercontent.com/oscm/shell/master/database/mysql/5.7/mysql-connector-java.sh | bash curl -s https://ra…

佩奇扑街、外星人疯狂!Python 告诉你大年初二应该看哪部电影
作者 | 罗昭成责编 | 唐小引转载自 CSDN资讯(ID:CSDNnews)引言2019 年 1 月,《啥是佩奇》短片在互联网快速传播,各大社交平台形成刷屏之势。不到 24 小时,官博发出的视频已经收获 2800 万次观看,…

【POCO】POCO学习总结(二)——配置选择
使用方法: configure {options} options总结 –help:打印帮助 –config< config_name> 使用给定配置,在poco-1.7.8p3-all/build/config目录下,可以在对应的配置文件中修改编译工具的路径和名字,编译时的选项等。 AIX Darw…

告别排队!用Python定时自动挂号和快捷查询化验报告
作者 | 阿文来源 | 程序人生(ID: coder_life)我什么要做这个事情去年单位体检查出问题来,经过穿刺手术确诊是个慢性肾脏病2期, IGA 肾病三期,可能大家对于这个病并不是很了解,但是另外一个词可能大家都听过…

【POCO】POCO学习总结(三)——交叉编译
最小功能编译 编译选项:–minimal :只构建XML, JSON, 工具 and 网络 1 修改配置文件 $ vi poco-1.7.8p3-all/build/config/ARM-Linux13 LINKMODE ? SHARED 14 TOOL ? arm-linux 15 POCO_TARGET_OSNAME Linux 16 POCO_TARGET_OSARCH ? armv7l 主要…

转:入侵网站必备-sql server
来源:http://www.bitscn.com/plus/view.php?aid28692 1.判断有无注入点 ; and 11 and 12 2.猜表一般的表的名称无非是admin adminuser user pass password 等.. and 0(select count(*) from *) and 0(select count(*) from admin) ---判断是否存在admin这张表 3.猜…

27.5. PROCEDURE ANALYSE()
数据列优化 SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements,[max_memory]]) 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

Linux 日志管理(RHEL7)
日志管理系统和程序的日记本记录系统,程序运行中发生的各种事件通过查看日志,了解及排除故障信息安全控制的依据 内核及系统日志由系统服务rsyslog统一记录/管理日志消息采用文本格式主要记录事件发生的时间,主机,进程,内容常见的日志文件 /var/log/messages 记录内核消息…

汇聚6年思想变迁:知识图谱报告幻灯片大全
本文汇总了中文知识图谱计算会议CCKS报告合集,涵盖从2013年至2018年,共48篇,从中可以看出从Google 2012年推出知识图谱以来,中国学术界及工业界这6年来知识图谱的主流思想变迁。作者 | 刘焕勇来源 | CSDN博客编辑 | apddd项目介绍…

【POCO】POCO学习总结(四)——MinGW编译poco
在window下使用MinGW编译poco 使用MSYS 下载MSYS 官网介绍:http://www.mingw.org/wiki/Getting_Started 官网下载:https://jaist.dl.sourceforge.net/project/mingw/Installer/mingw-get-setup.exe 安装 运行mingw-get-setup.exe,只选择…

辞职之后的思考--激励
本人曾拿过多次奖金,也曾与很多同事沟通过拿奖金的感觉,引发一些思考,这其实也是希望在以后有机会给别人发奖金时做参考之用。 并不是所有人都会有奖金,所以如果我没有奖金其实也没有什么关系,但是,我非…

【linux】串口编程(一)——配置串口
目前遇到的串口编程都是用于通信,很少作为终端显示。以前没有对串口编程做深入研究,本次以libmodbus源码中对串口的设置为例,详解总结串口编程时配置的属性(struct termios) 以libmodbus中_modbus_rtu_connect函数为例…

Playboy封面女郎、互联网第一夫人,程序员们的“钢铁审美”
整理 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 46 年前,《花花公子》(Playboy)的一期杂志封面女郎 Lenna,成为数万“钢铁直男”的梦中女神。然而,这位女性更为人所知的是她在计算机图像处理领…

开源实时日志分析ELK
开源实时日志分析ELK 2018-01-04 转自:开源实时日志分析ELK平台部署 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性…

【linux】串口编程(二)——非阻塞接收
项目中很少会使用阻塞接收,一般都是selectread监听模式来实现非阻塞接收。 使用selece时,需要处理一些异常情况的返回,比如:系统中断产生EINTR错误;超时错误ETIMEDOUT。 使用read时,需要处理读取时可能出现…

使用Photoshop制作网页模板
用图层组管理网页元素首先是在Photoshop中制作好网页的框架。网页中的元素有很多, 像Banner条、文本框、文字、版权、Logo、广告等。尽量把这些相对独立的元素放在不同的图层中,这样方便以后的再编辑。不过图层一多,就 显得很凌乱,…

赵本山:我的时代还没有结束 | Python告诉你
作者 | 丁彦军来源 | 恋习Python(ID: sldata2017)【AI科技大本营按】今年春晚的小品好看吗?没有了赵本山的春晚总觉得少了点什么,然而许久不登春晚舞台的本山大叔借着B站的东风证明了「你大爷还是你大爷」。最近很多人被“改革春…

038——VUE中组件之WEB开发中组件使用场景与定义组件的方式
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>组件之WEB开发中组件使用场景与定义组件的方式</title><script src"vue.js"></script> </head> <body> <…