Libevent介绍

在include\event2\event.h中有关于Libevent的介绍,这里简单翻译介绍一下:

Libevent是以事件为驱动的开发可扩展的网络服务端的库。

开放的API设置事件的回调函数,当事件来暂时调用这个回调函数。它还支持信号和定时器。

开发人员仅仅须要简单的add/remove来将事件加入到event loop中,通过event_dispatch驱动event。

Libevent支持 /dev/poll, kqueue(2), select(2), poll(2),

epoll(4), and evports。

内部的事件机制和应用接口相互独立,因此内部实现的更新不影响应用程序。

Libevent能够用于多线程。

安装

在官网下载http://libevent.org。我下载了最新版本号libevent-2.0.22-stable.tar.gz。放到文件夹,解压缩tar -zxvf ibevent-2.0.22-stable.tar.gz。

解压后进入文件夹,进行配置。把库安装到/usr文件夹下

./configure --prefix=/usr

编译安装

sudo make
sudo make install

查看是否成功安装:

ls -al /usr/lib|grep libevent
lrwxrwxrwx 1 root root 21 8月 11 00:04 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9
-rwxr-xr-x 1 root root 920932 8月 11 00:04 libevent-2.0.so.5.1.9
-rw-r--r-- 1 root root 1309268 8月 11 00:04 libevent.a
lrwxrwxrwx 1 root root 26 8月 11 00:04 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9
-rwxr-xr-x 1 root root 557242 8月 11 00:04 libevent_core-2.0.so.5.1.9
-rw-r--r-- 1 root root 821804 8月 11 00:04 libevent_core.a
-rwxr-xr-x 1 root root 974 8月 11 00:04 libevent_core.la
lrwxrwxrwx 1 root root 26 8月 11 00:04 libevent_core.so -> libevent_core-2.0.so.5.1.9
lrwxrwxrwx 1 root root 27 8月 11 00:04 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9
-rwxr-xr-x 1 root root 379504 8月 11 00:04 libevent_extra-2.0.so.5.1.9
-rw-r--r-- 1 root root 487536 8月 11 00:04 libevent_extra.a
-rwxr-xr-x 1 root root 981 8月 11 00:04 libevent_extra.la
lrwxrwxrwx 1 root root 27 8月 11 00:04 libevent_extra.so -> libevent_extra-2.0.so.5.1.9
-rwxr-xr-x 1 root root 939 8月 11 00:04 libevent.la
lrwxrwxrwx 1 root root 29 8月 11 00:04 libevent_openssl-2.0.so.5 -> libevent_openssl-2.0.so.5.1.9
-rwxr-xr-x 1 root root 90317 8月 11 00:04 libevent_openssl-2.0.so.5.1.9
-rw-r--r-- 1 root root 110340 8月 11 00:04 libevent_openssl.a
-rwxr-xr-x 1 root root 1010 8月 11 00:04 libevent_openssl.la
lrwxrwxrwx 1 root root 29 8月 11 00:04 libevent_openssl.so -> libevent_openssl-2.0.so.5.1.9
lrwxrwxrwx 1 root root 30 8月 11 00:04 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9
-rwxr-xr-x 1 root root 20571 8月 11 00:04 libevent_pthreads-2.0.so.5.1.9
-rw-r--r-- 1 root root 14322 8月 11 00:04 libevent_pthreads.a
-rwxr-xr-x 1 root root 1002 8月 11 00:04 libevent_pthreads.la
lrwxrwxrwx 1 root root 30 8月 11 00:04 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9
lrwxrwxrwx 1 root root 21 8月 11 00:04 libevent.so -> libevent-2.0.so.5.1.9

样例

写各測试程序,编译时要设置參数-levent,连接libevent的库。

echoServer.cc

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <event.h>
#include <stdlib.h>
#include <unistd.h> #define PORT 8000
#define BACKLOG 5
#define MEM_SIZE 1024 struct event_base* base;
struct sockEvent
{
struct event* readEvent;
struct event* writeEvent;
char* buffer;
}; void releaseSockEvent(struct sockEvent* ev)//delete from base and free it
{
event_del(ev->readEvent);
free(ev->readEvent);
free(ev->writeEvent);
free(ev->buffer);
free(ev);
} void handleWrite(int sock, short event, void* arg)
{
char* buffer = (char*)arg;
send(sock, buffer, strlen(buffer), 0); free(buffer);
} void handldRead(int sock, short event, void* arg)
{
struct event* writeEvent;
int size;
struct sockEvent* ev = (struct sockEvent*)arg;
ev->buffer = (char*)malloc(MEM_SIZE);
bzero(ev->buffer, MEM_SIZE);
size = recv(sock, ev->buffer, MEM_SIZE, 0);
printf("receive data:%s, size:%d\n", ev->buffer, size);
if (size == 0) //client has send FIN
{
releaseSockEvent(ev);
close(sock);
return;
}
//add event to base to send the received data
event_set(ev->writeEvent, sock, EV_WRITE, handleWrite, ev->buffer);
event_base_set(base, ev->writeEvent);
event_add(ev->writeEvent, NULL);
} void handleAccept(int sock, short event, void* arg)//when new connection coming, calling this func
{
struct sockaddr_in cli_addr;
int newfd;
socklen_t sinSize;
struct sockEvent* ev = (struct sockEvent*)malloc(sizeof(struct sockEvent));
ev->readEvent = (struct event*)malloc(sizeof(struct event));
ev->writeEvent = (struct event*)malloc(sizeof(struct event));
sinSize = sizeof(struct sockaddr_in);
newfd = accept(sock, (struct sockaddr*)&cli_addr, &sinSize);
//set the new coming connection event
event_set(ev->readEvent, newfd, EV_READ|EV_PERSIST, handldRead, ev);
event_base_set(base, ev->readEvent);
event_add(ev->readEvent, NULL);
} int main(int argc, char* argv[])
{
struct sockaddr_in serverAddr;
int sock; sock = socket(AF_INET, SOCK_STREAM, 0);
int on = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int));
//memset(&serverAddr, 0, sizeof(serverAddr));
bzero(&serverAddr, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = INADDR_ANY;
bind(sock, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr));
listen(sock, BACKLOG); struct event listenEvent;
base = event_base_new();//Create new EventBase
event_set(&listenEvent, sock, EV_READ|EV_PERSIST, handleAccept, NULL);//conbine listenEvent and it's callback function
event_base_set(base, &listenEvent);
event_add(&listenEvent, NULL);
event_base_dispatch(base);//start base return 0;
}

libevent源码分析-介绍、安装、使用的更多相关文章

  1. 【转】libevent源码分析

    libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...

  2. Libevent源码分析 (1) hello-world

    Libevent源码分析 (1) hello-world ⑨月份接触了久闻大名的libevent,当时想读读源码,可是由于事情比较多一直没有时间,现在手头的东西基本告一段落了,我准备读读libeven ...

  3. libevent源码分析

    这两天没事,看了一下Memcached和libevent的源码,做个小总结. 1.入门 1.1.概述Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络 ...

  4. libevent源码分析一--io事件响应

    这篇文章将分析libevent如何组织io事件,如何捕捉事件的发生并进行相应的响应.这里不会详细分析event与event_base的细节,仅描述io事件如何存储与如何响应. 1.  select l ...

  5. MyBatis 源码分析——介绍

    笔者第一次接触跟MyBatis框架是在2009年未的时候.不过那个时候的他并不叫MyBatis,而是叫IBatis.2010年的时候改为现在的名字--MyBatis.这几年过去了,对于笔者来讲有一点陌 ...

  6. Libevent源码分析系列【转】

    转自:https://www.cnblogs.com/zxiner/p/6919021.html 1.使用libevent库     源码那么多,该怎么分析从哪分析呢?一个好的方法就是先用起来,会用了 ...

  7. Libevent源码分析系列

    1.使用libevent库     源码那么多,该怎么分析从哪分析呢?一个好的方法就是先用起来,会用了,然后去看底层相应的源码,这样比较有条理,自上向下掌握.下面用libevent库写个程序,每隔1秒 ...

  8. libevent源码分析二--timeout事件响应

    libevent不仅支持io事件,同时还支持timeout事件与signal事件,这篇文件将分析libevent是如何组织timeout事件以及如何响应timeout事件. 1.  min_heap ...

  9. Libevent源码分析—event_init()

    下面开始看初始化event_base结构的相关函数.相关源码位于event.c event_init() 首先调用event_init()初始化event_base结构体 struct event_b ...

随机推荐

  1. 《深入理解java虚拟机》:类的初始化

    深入理解java虚拟机>:类的初始化 类从被载入到虚拟机内存中開始.到卸载出内存为止,它的整个生命周期包含:载入.验证.准备.解析.初始化.使用和卸载七个阶段.当中验证.准备.解析3个部分统称为 ...

  2. 基本3D变换之World Transform, View Transform and Projection Transform

    作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...

  3. HDU 1166 敌兵布阵 Segment Tree题解

    本题是最主要的分段树操作了.或者一般叫线段树,只是好像和线段没什么关系,仅仅是分段了. 不使用lazy标志,更新仅仅是更新单点. 假设不使用分段树,那么更新时间效率仅仅须要O(1),使用分段树更新效率 ...

  4. 逐步配置企业版Symantec Norton防病毒服务器

    逐步配置企业版Symantec Norton防病毒服务器 配置企业版Symantec Norton NT操作系统,已经安装IIS 安装Symantec Norton 10 安装系统中心 650) th ...

  5. GetListToJson

    List<Models.ArticleModel> list = GetList(page);    return Newtonsoft.Json.JsonConvert.Serializ ...

  6. cx_Oracle

    cx_Oracle 安装 pip install cx_Oracle 只是我没用那个安装成功过.我找了rpm 包. http://nchc.dl.sourceforge.net/project/cx- ...

  7. git 当出现 devirge 时,一个是commit的提交顺序不对

    进入新分支1.git pull origin branchname 2.修改 3.git add . 4.git commit  5. git pull 6.git push 出现分歧要,就版本回退, ...

  8. C#中对XML的操作

    现在有一个xml文件,名称:BookStore.xml,数据如下: <?xml version="1.0" encoding="gb2312"?>& ...

  9. cmake的使用笔记

    一. cmake使用网上还蛮多的.可是当你自己去用的时候,才觉得,都不是你想要的. 自己做个记录,用法全是基本用法. 二. 我在里面直接写注释说明了,直接贴了. 1. #cmake #1. # cma ...

  10. 【hdu 1403】Longest Common Substring

    [链接]h在这里写链接 [题意] 求两个串的最长公共子串. [题解] Sa[i]表示的是字典序为i的后缀的起始位置. 可以把两个字符串合在一起(中间用一个比'z'大的字符分割); 则如果Sa[i-1] ...