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. BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...

  2. django 简单会议室预约(4)

    基本的配置已经完成了,来看看最重要的views.py 先看看简单的注册登录功能,在django里有一个专门的模块用来验证用户信息 :所以只需要调用就好了: #-*-coding:utf-8 -*- f ...

  3. STM32 输入捕获的脉冲宽度及频率计算

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...

  4. [D3] Draw a basic US d3-geo map

    Install: npm install --save d3 d3-geo topojson Code: import React, {Component} from 'react'; import ...

  5. PMP杂谈--名词解释

    过程:PMP中常常提到过程,好像非常高大上,实则不然,过程说白了就是一系列的行动和活动,用来创建预定的产品,服务或成果. 就这么简单. 再深入点就是,行动和活动当然都会有ITTO(输入,工具和技术.输 ...

  6. 106.TCP传文件

    客户端 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include < ...

  7. 103.tcp通信实现远程控制

    客户端代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include < ...

  8. 1.2 Use Cases中 Messaging官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ 下面是一些关于Apache kafka 流行的使用场景.这些领域的概述,可查看博客文 ...

  9. C++中引用传递与指针传递区别

    C++中引用传递与指针传递区别 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程 ...

  10. 一些常用JS函数和技巧总结

    1.JS原生函数parseInt(),返回字符串的第一个数字,默认是十进制. 2.!!data.success  //强制转换成布尔类型