
libevent源码分析
文章平均质量分 77
libevent是一款使用C语言的网络库,支持跨平台移植,一个轻量级的网络库
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
libevent源码分析---让libevent支持多线程
Libevent本身不是多线程安全的,在多核的时代,如何能充分利用CPU的能力呢,这一节来说说如何在多线程环境中使用libevent,跟源代码并没有太大的关系,纯粹是使用上的技巧。1 错误使用示例 在多核的CPU上只使用一个线程始终是对不起CPU的处理能力啊,那好吧,那就多创建几个线程,比如下面的简单服务器场景。1 主线程创建工作线程1;2 接着主线程监听在端口上,等待新的转载 2014-03-07 20:40:40 · 4420 阅读 · 1 评论 -
libevent源码分析--evbuffer和bufferevent的关系
在libevent中还有一个很重要的部分。evbuffer和bufferevent。evbuffer是一个缓冲区,用户可以向evbuffer添加数据,evbuffer和bufferevent经常一起使用,或者说bufferevent使用了evbuffer,bufferevent有两个evbuffer缓冲,还有event。说明bufferevent是一个带有缓冲区的I/O。可以使用它们!用户原创 2014-03-04 20:55:32 · 4757 阅读 · 0 评论 -
libevent源码分析---回顾主要的结构体
以前忘记说明,这里源码分析使用的是libevent库的1.4.12-stable版本,在2.0以上的版本都是4W+行,过于庞大,网络上看到关于libevent库中几个重要的结构体关系图,很清楚很好,感谢原作者的细致:(虚线部分代表包含关系)一、tail_queue 关于tail_queue的解释在上篇文章中很细致。二、event //event提供了函数接口转载 2014-02-23 09:20:21 · 2229 阅读 · 1 评论 -
libevent源码分析-- queue.h中TAILQ_QUEUE的理解
libevent中的例子中使用的是FreeBSD下的queue.h,在linux的/usr/include/sys/queue.h也有该头文件,但是是一个缩减版本,而且没有看到queue 的access method,不知道是不是跟我们的linux服务器版本有关,没办法google了一下,找到了FreeBSD 下queue.h的定义,我们看一下tail queue的定义#define TAIL原创 2014-02-21 17:08:08 · 7511 阅读 · 3 评论 -
libevent源码分析--I/O事件
本文将从一个使用libevent的小例子出发,解释libevent处理事件的流程.例子如下:01.staticvoid fifo_read(intfd, short event, void *arg) {...}02. 03.intmain (int argc, char **argv)04.{05.intsocket = open ("/t原创 2014-02-21 12:16:12 · 2178 阅读 · 0 评论 -
libevent源码分析--定时器和信号事件处理
Timer事件反应堆event_base包含了一个最小堆min_heap结构体的实例,以此维护注册到这个反应堆实例的定时器事件:view sourceprint?1.structevent_base {2.//其他成员3.structmin_heap timeheap;4.};回顾一下最小堆min_heap:view sour原创 2014-02-21 11:44:45 · 4584 阅读 · 0 评论 -
libevent源码分析--libevent库对信号事件的处理
信号的处理在libevent中也是一个很重要的部分,同时处理的也很巧妙,这里根据自己的理解分析其堆信号的处理。和信号相关的几个重要API都是如何调用的。这是网上关于libevent处理信号的过程图解(感谢原作者,由这个图来分析libevent如何处理信号的)一、evsignal_init()函数(这里的分析都是按照IO复用机制的epOLL) 这个信号初始化在epol转载 2014-02-20 21:24:27 · 2573 阅读 · 0 评论 -
libevent源码分析--如何将定时器和信号事件都集合到I/O复用中
我的理解: 在I/O多路复用机制用(这里使用epoll作为例子),epoll_wait在一定的时间内监听需要受到关注的套接字,如果只是关注I/O事件,这样就会很简单,在设置时间的时候没有任何限制,此函数返回后,得到的有事件的套接字的个数,在libevent中使用的event_base_loop这个函数打到这个目的的,里面的evse->dispatch()这个函数就是epoll_wa原创 2014-02-18 21:58:33 · 2259 阅读 · 0 评论 -
libevent源码分析---时间管理模块
一、在event_base_loop()函数中有和时间相关的部分: 其中tv_cache用来记录时间缓存的,base->tv_cache.tv_sec = 0; 在这里讲时间缓冲清空,在while()循环中,首先校正时间(timeout_correct(base,&tv);),这个校正是存在目的的,接下来再介绍,时间校正结束再在最小堆中找最小时间,使用的函数为timeout_ne原创 2014-02-18 19:48:04 · 1806 阅读 · 0 评论 -
libevent源码分析--epoll_add()函数
首先看看add函数实在event_add函数中调用的,肯定是evsel->add的方式调用的。259 static int260 epoll_add(void *arg, struct event *ev)261 {262 struct epollop *epollop = arg;263 struct epoll_event epev = {0, {0}}原创 2014-01-14 17:11:53 · 2621 阅读 · 0 评论 -
libevent源代码分析——event_dispatch() (二)
在上篇文章中介绍关于event_dispatch的大体框架,这里对其中的几个重要的函数解释说明1、timeout_correct(base,&tv)static void 889 timeout_correct(struct event_base *base, struct timeval *tv) 890 { 891 struct event **pev; 892原创 2014-01-14 15:19:04 · 2336 阅读 · 0 评论 -
libevent源代码分析--event_dispatch() (一)
event_dispatch这个函数是以上所有处理都结束以后,最后的一个借口调用,其实和这个函数类似的函数有好几个,接下来一一分析。int 405 event_dispatch(void) 406 { 407 return (event_loop(0)); 408 }可以返现event_dispatch只有一个调用event_loop(),但是event_loop函数的调原创 2014-01-14 14:44:27 · 7276 阅读 · 0 评论 -
libevent源码分析--event_add()函数
event_add是第三个函数,函数参数ev是指向要注册的事件,tv是超时时间,函数将ev注册到ev->ev_base上,事件类型由ev->ev_events指明。如果注册成功,ev讲被插入到已经注册链表中,如果tv不是null,则会同时注册定时事件,将ev添加到timer堆上,其中的巧妙之处请看以下分析int 720 event_add(struct event *ev, const原创 2014-01-13 22:14:04 · 8741 阅读 · 0 评论 -
libevent源码分析--event_set()函数
如果按照正常使用libevent库的流程来说,首先调用event_init()函数,然后调用event_set()函数,然后event_add()函数,然后是event_dispatch()函数。1、event_init() 创建一个event_base对象也就是创建一个新的libevent实例,该函数同时还堆新生成的libevent实例进行了初始化。首先为event_base实例申请了空间,原创 2014-01-13 22:05:31 · 8911 阅读 · 0 评论 -
libevent源码分析--event_init()函数
尝试着解释几个重要的函数,首先是event_inint()函数,这个函数式最初就需要使用的函数,此函数初始化了一个全局的变量current_base,也就是event_base,默认情况下所有的event都是在想这个变量中添加。struct event_base *event_init(void) { struct event_base *base = event_base_new原创 2014-01-13 21:20:27 · 6459 阅读 · 1 评论 -
libevent源码分析--事件处理框架
前面已经对libevent的事件处理框架和event结构体做了描述,现在是时候剖析libevent对事件的详细处理流程了,本节将分析libevent的事件处理框架event_base和libevent注册、删除事件的具体流程,可结合前一节libevent对event的管理。1 事件处理框架-event_base 回想Reactor模式的几个基本组件,本节讲解的部分对应于Reacto原创 2014-01-13 11:10:44 · 2193 阅读 · 0 评论 -
libevent源码分析--核心部分event
对事件处理流程有了高层的认识后,本节将详细介绍libevent 的核心结构event,以及libevent对event的管理。1 libevent的核心-event Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执原创 2014-01-13 10:21:11 · 2361 阅读 · 2 评论 -
libevent源码分析--代码结构
Libevent的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent 框架、对系统I/O多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基于libevent的两个实用库等几个部分,有些部分可能就是一个源文件。源代码中的test部分就不在我们关注的范畴了。1)头文件主要就是原创 2014-01-13 10:05:52 · 2554 阅读 · 5 评论 -
libevent源码分析---基本使用场景和事件流程
当应用程序向libevent 注册一个事件后,libevent 内部是怎么样进行处理的呢?下面的图就给出了这一基本流程。1) 首先应用程序准备并初始化event,设置好事件类型和回调函数;这对应于event_set()和event_base_set()两个函数;2) 向libevent 添加该事件event。对于定时事件,libevent 使用一个小根堆管理,key为超时时间;原创 2014-01-13 10:01:16 · 3289 阅读 · 0 评论 -
libevent的使用--socket异步编程
这篇文章介绍下libevent在socket异步编程中的应用。在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的函数(或接口)并向系统注册,然后在需要的时候只向系统提交读写的请求之后就继续做自己的事情,实际的读写操作由系统在合适的时候调用我们程序注册的接口进行。异步编程会给一些程序猿带来一些理解和编写上的困难,原创 2014-01-12 09:26:18 · 2327 阅读 · 0 评论 -
libevent源代码分析--buffer的使用
你可能注意到随着我们代码变得越来越高效,程序也变得更加复杂。当我们产生一个进程的时候,我们没有必要为每一个链接管理一个buffer,我们只需要每个处理独立栈分配缓冲区就可以了。在读和写的时候,我们不必明确的跟踪每一个socket,这在我们的代码里是一个暗示,我们没有必要定义一个结构体去跟踪每一个操作什么时候完成,我们只需要使用循环栈变量就可以了。 此外,如果你在windows网原创 2013-12-20 22:53:59 · 2478 阅读 · 0 评论 -
libevent库的使用--定时器的使用
#include #include #include #include #include #include #include #include #define RELOAD_TIMEOUT 5#define DEFAULT_FILE "sample.html"char *filedata;time_t lasttime = 0;char filename[80];in原创 2013-12-19 22:01:26 · 2017 阅读 · 0 评论 -
libevent库的使用--内置http服务器
如果希望构建本机应用程序,可以使用一般的基于网络的 libevent 接口;但是,越来越常见的场景是开发基于 HTTP 协议的应用程序,以及装载或动态地重新装载信息的网页。如果使用任何 AJAX 库,客户端就需要 HTTP,即使您返回的信息是 XML 或 JSON。libevent 中的 HTTP 实现并不是 Apache HTTP 服务器的替代品,而是适用于与云和 web 环境相关联的大规模转载 2013-12-19 21:59:56 · 7066 阅读 · 1 评论 -
libevent的使用方法--回显服务器的简单实例
#include #include #include #include #include #include #include #include #include #include #define SERVER_PORT 8080int debug = 0;struct client { int fd; struct bufferevent *buf_ev;};原创 2013-12-19 20:43:00 · 2388 阅读 · 0 评论 -
libevent库的使用方法
接写一个很简单的 Time Server 来当作例子:当你连上去以后 Server 端直接提供时间,然后结束连线。event_init() 表示初始化 libevent 所使用到的变数。event_set(&ev, s, EV_READ | EV_PERSIST, connection_accept, &ev) 把 s 这个 File Description 放入 ev (第一个参数与第二个参数)原创 2013-12-19 19:11:00 · 2290 阅读 · 1 评论 -
libevent源码分析--事件处理框架
前面已经对libevent的事件处理框架和event结构体做了描述,现在是时候剖析libevent对事件的详细处理流程了,本节将分析libevent的事件处理框架event_base和libevent注册、删除事件的具体流程,可结合前一节libevent对event的管理。1 事件处理框架-event_base回想Reactor模式的几个基本组件,本节讲解的部分对应于Reactor框架转载 2013-12-18 12:17:44 · 1833 阅读 · 0 评论 -
libevent源代码分析--libevent核心event
对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的管理。1 libevent的核心-event Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执行相转载 2013-12-16 19:35:42 · 1696 阅读 · 0 评论 -
libevent源代码文件组织
——libevent源代码文件组织1 前言详细分析源代码之前,如果能对其代码文件的基本结构有个大概的认识和分类,对于代码的分析将是大有裨益的。本节内容不多,我想并不是说它不重要!2 源代码组织结构Libevent的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent框架、对系统I/O多路复用机制的封装、转载 2013-12-16 19:06:07 · 1969 阅读 · 0 评论 -
libevent和libev
构建现代的服务器应用程序需要以某种方法同时接收数百、数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作。有许多解决方 案,但是 libevent 库和 libev 库能够大大提高性能和事件处理能力。在本文中,我们要讨论在 UNIX® 应用程序中使用和部署这些解决方案所用的基本结构和方法。libev 和 libevent 都可以在高性能应用程序中使用,包括部署在 IBM C转载 2013-12-15 23:30:38 · 3323 阅读 · 0 评论 -
开源网络库的分析libevent muduo nginx ....
最经看关于网络编程的一些书,对于网络编程中的一些基本东西,开源库已经封装的很好了,但是库归根结底还是使用的基本API,所以就想着分析一下,尤其是在看了各个库的介绍以后,所以这段时间想在这个方向投入一点时间,虽说还是要复习考试!!!!原创 2013-12-15 23:02:19 · 8401 阅读 · 0 评论 -
libevent源码分析--I/O 定时 信号 被处理的安排
关于这几个事件对应的初何时何地初始化、何时何地事件被添加、何时何地添加到激活队列、处理流程:一、i/o事件 I/O事件的初始化是在event_set函数中被初始化 I/O事件的添加是在event_add函数中进行二、定时事件 定时事件的初始化是在event_add函数中进行,这个函数初始化了一些I/O和定时事件 定时事件添加原创 2014-03-07 21:55:49 · 2489 阅读 · 0 评论