Libevent学习:介绍与安装

时间:2022-03-10 00:16:29

参考:
官网:http://libevent.org
http://blog.csdn.net/sparkliang/article/details/4957667
http://blog.csdn.net/majianfei1023/article/details/46485705

1. Libevent简介

Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚。Libevent是用c语言编写的而且几乎是无处不函数指针,学习其源代码也需要相当的c语言基础。

Libevent 有几个显著的亮点:
事件驱动(event-driven),高性能;
轻量级,专注于网络,不如ACE那么臃肿庞大;
源代码相当精炼、易读;
跨平台,支持Windows、Linux、*BSD和Mac Os;
支持多种I/O多路复用技术, epoll、poll、dev/poll、select和kqueue等;
支持I/O,定时器和信号等事件;
注册事件优先级;
采用Reactor模式;

Libevent被广泛的应用,作为底层的网络库;比如memcached、Vomit、Nylon、Netchat等等。

学习libevent有助于提升程序设计功力,除了网络程序设计方面外,Libevent的代码里有很多有用的设计技巧和基础数据结构,比如信息隐藏、函数指针、c语言的多态支持、链表和堆等等,都有助于提升自身的程序功力。

2. 安装

所用Ubuntu+虚拟机的操作系统

ld@ubuntu:$ uname -a
Linux ubuntu 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

在官网上下载libevent-2.0.22-stable.tar.gz安装包
根据https://github.com/nmathewson/Libevent上的安装方式安装

./configure

make

make verify

make install

查看

ld@ubuntu:~$ whereis libevent-2.0.so.5
libevent-2.0.so: /usr/local/lib/libevent-2.0.so.5

主要的库
libevent_core:所有核心的事件和缓冲功能,包含了所有的event_base、evbuffer、bufferevent和工具函数。

libevent_extra:定义了程序可能需要,也可能不需要的协议特定功能,包括HTTP、DNS和RPC。

libevent:这个库因为历史原因而存在,它包含libevent_core和libevent_extra的内容。不应该使用这个库,未来版本的libevent可能去掉这个库。

libevent_pthreads:添加基于pthread可移植线程库的线程和锁定实现。它独立于libevent_core,这样程序使用libevent时就不需要链接到pthread,除非是以多线程方式使用libevent。

3. 主要的功能

Libevent提供了事件通知,io缓存事件,定时器,超时,异步解析dns,事件驱动的http server以及一个rpc框架。

事件通知:当文件描述符可读可写时将执行回调函数。

Io缓存:缓存事件提供了输入输出缓存,能自动的读入和写入,用户不必直接操作io。

定时器:libevent提供了定时器的机制,能够在一定的时间间隔之后调用回调函数。

信号:触发信号,执行回调。

异步的dns解析:libevent提供了异步解析dns服务器的dns解析函数集。

事件驱动的http服务器:libevent提供了一个简单的,可集成到应用程序中的HTTP服务器。

RPC客户端服务器框架:libevent为创建RPC服务器和客户端创建了一个RPC框架,能自动的封装和解封数据结构。

4. 编译实例


//每隔两秒输出"Hello,World!"

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/time.h> 
#include <event.h> 
// 定时事件回调函数 
void onTime(int sock, short event, void *arg)   
{   
    printf("Hello,World!\n");  

    struct timeval tv;   
    tv.tv_sec = 1;   
    tv.tv_usec = 0;   
    // 重新添加定时事件(定时事件触发后默认自动删除) 
    event_add((struct event*)arg, &tv);   
}   

int main()   
{   
    // 初始化 
    event_init();   

    struct event ev_time;   
    // 设置定时事件 
    evtimer_set(&ev_time, onTime, &ev_time);   

    struct timeval tv;   
    tv.tv_sec = 1;   
    tv.tv_usec = 0;   
    // 添加定时事件 
    event_add(&ev_time, &tv);   

    // 事件循环 
    event_dispatch();   

    return 0;   
}  

编译:gcc example1.c -o example1 -levent

5. 学习资源整理

官网:http://libevent.org
大神博客:http://blog.csdn.net/sparkliang/article/category/660506