libevent简介[翻译]1 关于这个文档

重复造轮子是一个学习过程,只有各种轮子都造过之后,才能安心的使用别人的轮子。

参考

http://www.wangafu.net/~nickm/libevent-2.1/doxygen/html/

https://libevent.org/

介绍

libevent是一个可扩展的事件驱动类型的网络库。当一个文件描述符有事件触发或是超时的时候,libevent可以执行回调函数进行通知。除此之外,libevent还可以提供基于信号或是定时器的回调通知功能。

libevent的作用就是替换网络服务器中的事件循环模式,取而代之的是异步通知的模式。一个应用,只需要调用 event_base_dispatch() ,然后就可以动态的增加事件到监听列表或是从监听列表删除一个事件,我们不需要关心事件循环是怎么回事,也不用操作或是修改它。

当前,libevent支持/dev/poll kqueue select pool epool和evports。libevent的事件机制,与底层的这些API完全独立,libevent的一个简单更新就可以提供新的功能,而我们完全不需要重新设计或是开发原来的程序。所以,libevent提供了可移植功能开发和可扩展的事件通知模型。libevent同样可以用作多线程的开发,在Linux BSD Mac OS X Solaris和Windows系统上都是可以使用的。

标准用法

如果使用libevent,必须要引用 <event2/event.h> 头文件,编译的时候需要增加 -levent 的参数链接libevent的库。如果只是想使用核心事件功能和IO缓存相关的代码,也可以使用 -levent_core 参数链接对应的库。

配置库

当我们再使用任何libevent的函数时,我们需要先配置一下对应的库。如果我们需要在多线程的条件下使用libevent,需要使用 evthread_use_pthreads() 或 evthread_use_windows_threads() 进行初始化来保证线程安全。我们也可以用 event_set_men_functions 来代替libevent里面的内存管理函数,这样就可以通过 event_enable_debug_mode() 打开调试模式。

创建一个event base

接下来,我们需要用 event_base_new() 或者 event_base_new_with_config() 创建一个 event_base 结构体。这个结构体负责监视事件的触发。每一个事件都与一个 event_base 的结构体关联。

事件触发

对于任何你像监视的文件描述符,都需要通过 event_new() 创建一个事件结构体。也可以声明一个事件结构体,然后调用 event_assign() 初始化。然后通过 event_add() 把这个结构体添加到事件监听列表中,这样就可以得到事件的触发信息了。这个事件结构体,必须要一直存在,知道事件触发,中间不可以释放资源,因为从添加到事件监视列表中到事件触发之间,libevent都会用到这个结构体,如果中间释放了资源,会导致出错。

事件分发

最后,我们需要调用 event_base_dispatch() 开启事件循环。同样可以使用 event_base_loop() 设置更详细的选项。

现在,同一时间只有一个线程可以分发调度一个 event_base 。如果想在多线程下触发多个事件,我们可以把一个 event_base 添加到工作队列或是创建多个 event_base 结构体。

IO缓冲

libevent在常规的事件回调基础上增加了一个IO缓冲的封装。这个叫做bufferevent,也就是缓冲事件。这个缓冲事件,提供了发送或是接收的缓冲,可以自动的接收数据或是把里面的数据发送出去。这样使用者就可以直接对缓冲区进行读写数据,而不用考虑IO底层细节的问题。

一旦通过 bufferevent_socket_new() 初始化了缓冲,这个缓冲结构体就可以使用 bufferevent_enable() 和 bufferevent_disable() 反复的操作。我们就可以使用 bufferevent_read() 和 bufferevent_write() 来代替直接读写socket了。

当描述符可以读的时候,bufferevent就试着读一些数据到缓冲区,读到数据后,通知我们直接使用。一般情况,bufferevent写的事件通知时,表示写缓冲区的数据已经全部发送完了,也就是里面都初始化为0。

定时器

libevent同样提供了定时器的功能,当定时器超时的时候,会有回调。 evtimer_new() 这个宏可以返回一个用于定时器的事件结构体。调用 evtimer_add() 来激活定时器。调用 evtimer_del() 来删除一个定时器。这些宏都是 event_new()  event_add() 和 event_del() 的封装,也可以直接调用这三个函数,自己操作。

异步的DNS解决方案

libevent提供了异步的DNS解决方案,可以替代传统的DNS解释器。详情参考 <event2/dns.h> 

事件驱动的HTTP服务

libevent提供了一个非常简单的基于事件驱动的HTTP服务的功能。可以嵌入到程序中,用来支持HTTP请求。详情参考 <event2/http.h> 

远程过程服务端和客户端框架

libevent提供了一个用于远程过程服务端和客户端的框架。需要注意封装和解封所有的数据结构体。

API介绍

 event2/event.h libevent的核心头文件
 event2/thread.h 用于多线程的函数
 event2/buffer.h  event2/bufferevent.h 用于网络数据读写的缓冲区功能
 event2/util.h 用于跨平台的非阻塞网络编程的工具库
 event2/dns.h 异步DNS解决方案
 event2/http.h 嵌入式的基于libevent的HTTP服务器
 event2/rpc.h 创建RPC服务器和客户端的框架

原文地址:https://www.cnblogs.com/studywithallofyou/p/13039133.html