
Libevent
Libevent网络库源码分析
amoscykl
Casablanca!
展开
-
Libevent使用实例1 (简单)
客户端:#include<event2/event-config.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#include<unis...原创 2018-09-21 15:39:47 · 2002 阅读 · 0 评论 -
Libevent使用实例2 (中等) : bufferevent
客户端:#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#include<unistd.h>#include<stdio.h>#incl原创 2018-09-21 16:06:27 · 523 阅读 · 0 评论 -
Libevent使用实例3 (高级) : evconnlistenner监听器
客户端:#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#include<unistd.h>#include<stdio.h>#incl原创 2018-09-21 16:30:20 · 849 阅读 · 0 评论 -
Libevent网络库学习经验分享
学习之前当然要先安装Libevent ,先到github上根据自己的坏境构建安装:项目地址:Libevent 安装配置完成后,根据以下的专栏博客对照学习源码。 推荐几个专栏博客,写的非常棒。1. sparkliang的专栏 :这个专栏总结性比较好,建议先阅读这个专栏,了解Libevent的大概。 2. Libevent源码分析 : 这个专栏分析了Lib...原创 2018-09-21 17:29:14 · 700 阅读 · 0 评论 -
Libevent源码分析-----开篇
我所分析的Libevent版本是2.0.21版本,是目前最新的稳定版本。看这系列博文中,需要读者有Linux编程的一些基础。因为像POSIX、文件描述符、多线程等等这些概念,我并不会去解释,我默认读者已经熟悉这些概念了。如果读者读过《UNIX环境高级编程》,那就完全没问题了。 因为Libevent是跨平台的,所以它使用了很多它自己定义的通用跨平台类型,比如evutil_soc...转载 2018-10-02 20:37:43 · 2181 阅读 · 0 评论 -
Libevent源码分析-----event-config.h指明所在系统的环境
如果你打开Libevent的一些文件,比如util.h文件。就会发现使用了很多宏定义,并根据一些宏定义而进行条件编译。这些宏定义往往来自event-config.h文件中。 如util.h文件的代码开始处:#ifdef _EVENT_HAVE_SYS_TIME_H#include <sys/time.h>#endif#ifdef...转载 2018-10-02 20:40:44 · 454 阅读 · 0 评论 -
Libevent源码分析-----内存分配
Libevent的内存分配函数还是比较简单的,并没有定义内存池之类的东西。如同前一篇博客那样,给予Libevent库的使用者充分的设置权(定制),即可以设置用户(Libevent库的使用者)自己的内存分配函数。至于怎么分配,主动权在于用户。但在设置(定制)的时候要注意一些地方,下面会说到。 首先,如果要定制自己的内存分配函数,就得在一开始配置编译Libevent库是,不能...转载 2018-10-02 20:43:48 · 251 阅读 · 0 评论 -
Libevent源码分析-----多线程、锁、条件变量(一)
Libevent提供给用户的可见多线程API都在thread.h文件中。在这个文件提供的API并不多。基本上都是一些定制函数,像前面几篇博文说到的,可以为Libevent定制用户自己的多线程函数。 开启多线程: Libevent默认是不开启多线程的,也没有锁、条件变量这些东西。这点和前面博客说到的"没有定制就用Libevent默认提供",有所不同。只有当你调用了evth...转载 2018-10-02 20:48:00 · 430 阅读 · 0 评论 -
Libevent源码分析-----多线程、锁、条件变量(二)
Debug锁操作: Libevent还支持对锁操作的一些检测,进而捕抓一些典型的锁错误。Libevent检查:解锁自己(线程)没有持有的锁 在未解锁前,自己(线程)再次锁定一个非递归锁。 Libevent通过一些变量记录锁的使用情况,当检查到这些锁的错误使用时,就调用abort,退出运行。 开启调试功能: 用户只需在调...转载 2018-10-02 20:53:02 · 280 阅读 · 0 评论 -
Libevent源码分析-----TAILQ_QUEUE队列
Libevent源码中有一个queue.h文件,位于compat/sys目录下。该文件里面定义了5个数据结构,其中TAILQ_QUEUE是使得最广泛的。本文就说一下这个数据结构。 队列结构体: TAILQ_QUEUE由下面两个结构体一起配合工作。#define TAILQ_HEAD(name, type) ...转载 2018-10-02 20:58:26 · 258 阅读 · 0 评论 -
Libevent源码分析-----event_io_map哈希表
上一篇博客说到了TAILQ_QUEUE队列,它可以把多个event结构体连在一起。是一种归类方式。本文也将讲解一种将event归类、连在一起的结构:哈希结构。 哈希结构体: 哈希结构由下面几个结构体一起配合工作:struct event_list{struct event *tqh_first;struct event **tqh_last;}...转载 2018-10-02 21:01:04 · 241 阅读 · 0 评论 -
Libevent源码分析-----event_signal_map
相关结构体: 因为event_signal_map结构体实在太简单了,所以不像event_io_map那样,有一个专门的文件。由于没有专门的文件,那么只能从蛛丝马迹上探索这个event_signal_map结构了。 通过一些搜索,可以得到与event_signal_map相关联的一些结构体有下面这些://TAILQ_HEAD (event_...转载 2018-10-02 21:02:51 · 199 阅读 · 0 评论 -
Libevent源码分析-----配置event_base
前面的博文都是讲一些Libevent的一些辅助结构,现在来讲一下关键结构体:event_base。 这里作一个提醒,在阅读Libevent源码时,会经常看到backend这个单词。其直译是“后端”。实际上其指的是Libevent内部使用的多路IO复用函数,多路IO复用函数就是select、poll、epoll这类函数。本系列博文中,为了叙述方便,“多路IO复用函数”...转载 2018-10-02 21:05:11 · 183 阅读 · 0 评论 -
Libevent源码分析-----跨平台Reactor接口的实现
之前的博文讲了怎么实现线程、锁、内存分配、日志等功能的跨平台。Libevent最重要的跨平台功能还是实现了多路IO接口的跨平台(即Reactor模式)。这使得用户可以在不同的平台使用统一的接口。这篇博文就是来讲解Libevent是怎么实现这一点的。 Libevent在实现线程、内存分配、日志时,都是使用了函数指针和全局变量。在实现多路IO接口上时,Libev...转载 2018-10-04 12:17:20 · 219 阅读 · 0 评论 -
Libevent源码分析-----Libevent工作流程探究
之前的博文讲了很多Libevent的基础构件,现在以一个实际例子来初步探究Libevent的基本工作流程。由于还有很多Libevent的细节并没有讲所以,这里的探究还是比较简洁,例子也相当简单。#include<unistd.h>#include<stdio.h>#include<event.h>#include<t...转载 2018-10-04 12:21:36 · 326 阅读 · 0 评论 -
Libevent源码分析-----信号event的处理
信号event的工作原理: 前面讲解了Libevent如何监听一个IO事件,现在来讲一下Libevent如何监听信号。Libevent对于信号的处理是采用统一事件源的方式。简单地说,就是把信号也转换成IO事件,集成到Libevent中。 统一事件源的工作原理如下:假如用户要监听SIGINT信号,那么在实现的内部就对SIGINT这个信号设置捕抓函数。此外,在实现的...转载 2018-10-04 12:25:51 · 324 阅读 · 0 评论 -
Libevent源码分析-----超时event的处理
如何成为超时event: Libevent允许创建一个超时event,使用evtimer_new宏。//event.h文件#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) 从宏的实现来看,它一样是用到了一般的event_new,并且不...转载 2018-10-04 12:29:45 · 1449 阅读 · 0 评论 -
Libevent源码分析-----与event相关的一些函数和操作
Libevent提供了一些与event相关的操作函数和操作。本文就重点讲一下这方面的源代码。 在Libevent中,无论是event还是event_base,都是使用指针而不会使用变量。实际上,如果查看Libevent不同的版本,就可以发现event和event_base这两个结构体的成员是不同的。对比libevent-2.0.21-stable和...转载 2018-10-04 12:31:46 · 355 阅读 · 0 评论 -
Libevent源码分析-----通用类型和函数
Libevent定义了一系列的可移植的兼容类型和函数。这使得在各个系统上都有一致的效果,Libevent一般都会在兼容通用类型和函数的前面加上ev或evutil前缀。 在实现上,Libevent都是使用条件编译+宏定义的方式。使用这种方式,同一个宏名字,可以使得在不同的系统上, 编译时得到不同的值。这种方式在跨平台编程中,经常使用到。此外,对于Libe...转载 2018-10-04 12:35:40 · 436 阅读 · 0 评论 -
Libevent源码分析-----连接监听器evconnlistener
使用evconnlistener: 基于event和event_base已经可以写一个CS模型了。但是对于服务器端来说,仍然需要用户自行调用socket、bind、listen、accept等步骤。这个过程有点繁琐,为此在2.0.2-alpha版本的Libevent推出了一些对应的封装函数。 用户只需初始化struct sockaddr_in结构体变...转载 2018-10-04 12:38:07 · 371 阅读 · 0 评论 -
Libevent源码分析-----evbuffer结构与基本操作
对于非阻塞IO的网络库来说,buffer几乎是必须的。Libevent在1.0版本之前就提供了buffer功能。现在来看一下Libevent的buffer。 buffer相关结构体: Libevent为buffer定义了下面的结构体://evbuffer-internal.h文件struct evbuffer_ch...转载 2018-10-04 13:36:47 · 248 阅读 · 0 评论 -
Libevent源码分析-----更多evbuffer操作函数
锁操作: 在前一篇博文可以看到很多函数在操作前都需要对这个evbuffer进行加锁。同event_base不同,如果evbuffer支持锁的话,要显式地调用函数evbuffer_enable_locking。//buffer.c文件int//参数可以是一个锁变量也可以是NULLevbuffer_enable_locking(struct evbuffer...转载 2018-10-04 13:41:03 · 326 阅读 · 0 评论 -
Libevent源码分析-----bufferevent工作流程探究
和之前的《Libevent工作流程探究》一样,这里也是用一个例子来探究bufferevent的工作流程。具体的例子可以参考《Libevent使用例子,从简单到复杂》,这里就不列出了。其实要做的例子也就是bufferevent_socket_new、bufferevent_setcb、bufferevent_enable这几个函数。 因为本文会用到《Libev...转载 2018-10-04 13:44:53 · 288 阅读 · 0 评论