![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
libevent
编程小问号
这个作者很懒,什么都没留下…
展开
-
libevent源码浅析: 定时器和信号
Timer事件反应堆event_base包含了一个最小堆min_heap结构体的实例,以此维护注册到这个反应堆实例的定时器事件:view sourceprint?1.struct event_base {2.//其他成员3.struct min_heap timeheap;4.};回顾一下最小堆min_he转载 2014-06-25 23:56:16 · 726 阅读 · 0 评论 -
libevent参考手册:创建event_base(二)
使用libevent函数之前需要分配一个或者多个event_base结构体。每个event_base结构体持有一个事件集合,可以检测以确定哪个事件是激活的。如果设置event_base使用锁,则可以安全地在多个线程中访问它。然而,其事件循环只能运行在一个线程中。如果需要用多个线程检测IO,则需要为每个线程使用一个event_base。Tip: [libevent的未来版本可能有event_转载 2014-08-17 01:22:43 · 776 阅读 · 0 评论 -
libevent参考手册:辅助类型和函数(五)
定义了很多在实现可移植应用时有用的函数,libevent内部也使用这些类型和函数。1 基本类型1.1 evutil_socket_t在除Windows之外的大多数地方,套接字是个整数,操作系统按照数值次序进行处理。然而,使用Windows套接字API时,socket具有类型SOCKET,它实际上是个类似指针的句柄,收到这个句柄的次序是未定义的。在Windows中,libevent定义e转载 2014-08-17 01:25:50 · 589 阅读 · 0 评论 -
Libevent参考手册:连接侦听器: 接受 TCP 连接(八)
Evconnlistener 机制为您提供了侦听和接受传入的 TCP 连接的方法。这一节中的所有函数与类型都是在event2/listener.h中声明。他们首次出现在 Libevent 2.0.2-alpha,除非另有说明。创建或释放 evconnlistener接口struct evconnlistener *evconnlistener_new(struct even转载 2014-08-17 01:32:36 · 694 阅读 · 0 评论 -
Libevent(1)— 简介、编译、配置
此文编写的时候,使用到的 Libevent 为 2.0.21Libevent 之跨平台在处理大量 SOCKET 连接时,使用 select 并不高效。各个系统都提供了处理大量 SOCKET 连接时的解决方案:Linux 下的 epoll()BSD 下的 kqueue()Solaris 下的 evportsWindows 下的 IOCP由于各个平台使用了不同的接口,那转载 2015-01-27 00:17:16 · 2183 阅读 · 0 评论 -
Libevent(2)— event、event_base
此文编写的时候,使用到的 Libevent 为 2.0.21。本文略过了关于 event 优先权和超时相关的讨论。创建和销毁 event_baseevent_base 是首先需要被创建出来的对象。event_base 结构持有了一个 event 集合。如果 event_base 被设置了使用锁,那么它在多个线程中可以安全的访问。但是对 event_base 的循环(下面会马上解释什转载 2015-01-27 00:18:25 · 660 阅读 · 0 评论 -
Libevent(3)— 基础库
此文编写的时候,使用到的 Libevent 为 2.0.21常用基本数据类型evutil_socket_t 用于保存 socketev_uint64_t 取值范围 [0, EV_UINT64_MAX]ev_int64_t 取值范围 [EV_INT64_MIN, EV_INT64_MAX]ev_uint32_t 取值范围 [0, EV_UINT32_MAX]ev_int32_t 取值转载 2015-01-27 00:20:26 · 530 阅读 · 0 评论 -
Libevent(5)— 连接监听器
此文编写的时候,使用到的 Libevent 为 2.0.21Libevent 提供了连接监听器 evconnlistener创建 evconnlistener 实例// 连接监听器回调函数原型typedef void (*evconnlistener_cb)( struct evconnlistener *listener, // 新的 socket evut转载 2015-01-27 00:21:50 · 627 阅读 · 0 评论 -
Libevent(4)— Bufferevent
此文编写的时候,使用到的 Libevent 为 2.0.21Buffer IO 模式bufferevent 提供给我们一种 Buffer IO 模式(这里以写入数据为例):在我们需要通过某个连接发送数据的时候,先将等待发送的数据放入到一个 buffer 中等待此连接可以写入数据尽可能多的获取 buffer 中的数据写入此连接如果 buffer 中还有需要写入的数据则继续等待直到此连转载 2015-01-27 00:21:24 · 544 阅读 · 0 评论 -
从 bufferevent 实现学习 Libevent 的使用
Libevent 2 提供了 bufferevent 接口,简化了编程的难度,bufferevent 实际上是对底层事件核心的封装,因此学习 bufferevent 的实现是研究 Libevent 底层 event、event_base 用法的一个好办法。本文假定你已经对 Libevent 有一定的认识,否则可以先阅读我关于 Libevent 的介绍: Libevent(1)— 简介、编译、配转载 2015-01-27 00:27:38 · 1048 阅读 · 0 评论 -
关于libevent与FreeBSD内核中TAILQ队列的理解
在看libevent源码中TAILQ的时候发现了一些让我迷惑的地方,就是里面的双端队列以及链表中节点的next与prev指针,它的设计与我们一般的链表以及linux内核的list完全不一样,因为里面的prev根本不是指向前一个节点,而是指向前一个节点的next元素的地址:#define TAILQ_HEAD(name, type)转载 2015-01-29 00:58:09 · 845 阅读 · 0 评论 -
Linux queue.h之TAILQ队列分析
libevent中的例子中使用的是FreeBSD下的queue.h,在linux的/usr/include/sys/queue.h也有该头文件,但是是一个缩减版本,而且没有看到queue 的access method,不知道是不是跟我们的linux服务器版本有关,没办法google了一下,找到了FreeBSD 下queue.h的定义,我们看一下tail queue的定义 C代码转载 2015-01-29 23:55:10 · 803 阅读 · 0 评论 -
深入理解TAILQ队列
工作的主要内容是tcp/ip,平台是FreeBSD,而且在内核态开发,所以很多情况下会涉及内核的一些数据结构和宏,比如说mbuf和TAILQ等。 TAILQ是FreeBSD/linux内核对双向队列操作的一种抽象,抽象程度不亚于C++,能实现操作队列需要的各种操作:插入元素,删除元素,遍历队列等。这个队列的优点是插入元素很快。 这里先回顾一下队列的特点(来自维基百科http://zh.wiki转载 2015-01-29 23:55:51 · 661 阅读 · 0 评论 -
Libevent参考手册:设置libevent(一)
#define EVENT_LOG_DEBUG 0#define EVENT_LOG_MSG 1#define EVENT_LOG_WARN 2#define EVENT_LOG_ERR 3#define _EVENT_LOG_DEBUG EVENT_LOG_DEBUG#define _EVENT_LOG_MSG EVENT_LOG_MSG#define _EVE转载 2014-08-16 21:36:58 · 653 阅读 · 0 评论 -
使用Libevent的快速可移植非阻塞网络编程:异步IO简介
大多数程序员从阻塞IO调用开始学习。如果调用在操作完成之前,或者在足够的时间已经过去使得网络堆栈放弃操作之前,不会返回,那么这个IO就是同步的。比如说,在TCP连接上调用connect()时,操作系统将一个SYN分组排队到TCP连接的另一端主机中。在收到来自对方主机的SYN ACK分组之前,或者在超时而决定放弃操作之前,控制不会返回到应用程序。这里有一个使用阻塞网络调用的简单客户端示例。它打开转载 2014-08-17 01:18:53 · 833 阅读 · 0 评论 -
libevent源码浅析: 事件处理框架
本文将从一个使用libevent的小例子出发,解释libevent处理事件的流程.例子如下:view sourceprint?01.static void fifo_read(int fd, short event, void *arg) {...}02. 03.int main (int argc, char **argv)转载 2014-06-25 23:57:42 · 707 阅读 · 0 评论 -
libevent 参考手册-前言
前言:Libevent 参考手册Libevent是一个提供快速可移植的非堵塞IO库,它设计的目标是:1、可移植性使用libevent写的程序,应该在所有支持Libevent平台上有效,甚至在没有真正好的方法进行非堵塞IO时,Libevent也应该支持这种方式,所以你的程序可以在有限的环境下运行。2、 高效性该库在每个平台上尝试使用最快且可用的非堵塞IO实现,同时不会引入很大的开转载 2014-07-19 00:52:26 · 521 阅读 · 0 评论 -
Libevent参考手册:evbuffer:缓冲IO实用功能
libevent的evbuffer实现了为向后面添加数据和从前面移除数据而优化的字节队列。evbuffer用于处理缓冲网络IO的“缓冲”部分。它不提供调度IO或者当IO就绪时触发IO的功能:这是bufferevent的工作。除非特别说明,本章描述的函数都在event2/buffer.h中声明。1 创建和释放evbuffer接口这两个函数的功能很简明:转载 2014-07-19 00:38:22 · 621 阅读 · 0 评论 -
libevent学习总结
对libevent进行一下简要的总结,libevent将socket、信号事件、定时器进行统一管理;Libevent首先会检查操作支持那种类型的多路复用函数,检查顺序为:evport、kqueue、epoll、devpoll、poll、select。 主要研究了一下libevent 对socket的管理,信号事件处理和定时器处理粗略看过(本文主要以epoll多路复用方式下的情况进行了简转载 2014-07-20 01:02:58 · 465 阅读 · 0 评论 -
使用 libevent 和 libev 提高网络应用性能
管理多个 UNIX 网络连接构建现代的服务器应用程序需要以某种方法同时接收数百、数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作。有许多解决方案,但是 libevent 库和 libev 库能够大大提高性能和事件处理能力。在本文中,我们要讨论在 UNIX® 应用程序中使用和部署这些解决方案所用的基本结构和方法。libev 和 libevent 都转载 2014-07-20 01:08:50 · 562 阅读 · 0 评论 -
libevent源码浅析: http库
libevent自带了一个http库,用它可以很简单的实现一个http服务器,本文非常简单地分析之.evhttpevhttp库有几个主要的结构体,它们之间的联系非常龌龊:其中,结构体event, min_heap, evsignal_info, eventop, event_base在前面几篇文章中已经介绍过了,这里不再啰嗦.evbufferevbuffer转载 2014-06-22 21:05:41 · 3006 阅读 · 0 评论 -
Libevent参考手册:设置libevent(二)
4 锁和线程编写多线程程序的时候,在多个线程中同时访问同样的数据并不总是安全的。libevent的结构体在多线程下通常有三种工作方式:² 某些结构体内在地是单线程的:同时在多个线程中使用它们总是不安全的。² 某些结构体具有可选的锁:可以告知libevent是否需要在多个线程中使用每个对象。² 某些结构体总是锁定的:如果libevent在支持锁的配置下运转载 2014-08-17 01:17:58 · 560 阅读 · 0 评论 -
Libevent参考手册:Evbuffers用于缓冲IO的实用工具(七)
Libevent的evbuffer功能通过实现一个字节队列,在队列末尾添加数据,在队列头移除数据。Evbuffers 是通常用来做缓冲网络 IO 的"缓冲区"部分。他们将不会提供安排 IO 或IO准备就绪时的触发等功能: 而这些功能是bufferevents应该做的。本章中的函数声明都在event2/buffer.h 中,除非另有说明。创建或释放 evbuffer接口struc转载 2014-08-17 01:32:11 · 898 阅读 · 0 评论 -
libevent参考手册:与事件一起工作(四)
libevent的基本操作单元是事件。每个事件代表一组条件的集合,这些条件包括:l 文件描述符已经就绪,可以读取或者写入l 文件描述符变为就绪状态,可以读取或者写入(仅对于边沿触发IO)l 超时事件l 发生某信号l 用户触发事件所有事件具有相似的生命周期。调用libevent函数设置事件并且关联到event_base之后,事件进入“已初始化(initialized转载 2014-08-17 01:24:09 · 457 阅读 · 0 评论 -
Libevent参考手册:前言
1 从一万英尺外看LibeventLibevent是用于编写高速可移植非阻塞IO应用的库,其设计目标是:v 可移植性:使用libevent编写的程序应该可以在libevent支持的所有平台上工作。即使没有好的方式进行非阻塞IO,libevent也应该支持一般的方式,让程序可以在受限的环境中运行。v 速度:libevent尝试使用每个平台上最高速的非阻塞IO实现,并且不引入转载 2014-08-16 21:26:44 · 473 阅读 · 0 评论 -
Libevent参考手册:与事件循环一起工作(三)
1 运行循环一旦有了一个已经注册了某些事件的event_base(关于如何创建和注册事件请看下一节),就需要让libevent等待事件并且通知事件的发生。接口#define EVLOOP_ONCE 0x01#define EVLOOP_NONBLOCK 0x02 int event_base_loop(struct event_base *base, int f转载 2014-08-17 01:21:46 · 515 阅读 · 0 评论 -
libevent参考手册:bufferevent:概念和入门(六)
很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。比如说,写入数据的时候,通常的运行模式是:l 决定要向连接写入一些数据,把数据放入到缓冲区中。l 等待连接可以写入。l 写入尽量多的数据。l 记住写入了多少数据,如果还有更多数据要写入,等待连接再次可以写入。这种缓冲IO模式很通用,libevent为此提供了一种通用机制,即bufferevent。buffereve转载 2014-08-17 01:29:29 · 2273 阅读 · 0 评论 -
libevent
Libevent 运用了大量的数据结构,小根堆:Libevent使用堆来管理Timer事件,其key值就是事件的超时时间,源代码位于文件min_heap.h中。所有的数据结构书中都有关于堆的详细介绍,向堆中插入、删除元素时间复杂度都是O(lgN),N为堆中元素的个数,而获取最小key值(小根堆)的复杂度为O(1)。堆是一个完全二叉树,基本存储方式是一个数组。哈希表:原创 2015-01-30 23:34:24 · 545 阅读 · 0 评论