转自:http://www.open-open.com/lib/view/open1386510630330.html

libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库。

总体来说,libevent有下面一些特点和优势:
* 事件驱动,高性能;
* 轻量级,专注于网络; 
* 跨平台,支持 Windows、Linux、Mac Os等; 
* 支持多种 I/O多路复用技术, epoll、poll、dev/poll、select 和kqueue 等;

* 支持 I/O,定时器和信号等事件;

libevent有下面几大部分组成:

* 事件管理包括各种IO(socket)、定时器、信号等事件,也是libevent应用最广的模块;

* 缓存管理是指evbuffer功能;

* DNS是libevent提供的一个异步DNS查询功能;

* HTTP是libevent的一个轻量级http实现,包括服务器和客户端

一些资料:
* libevent官网:http://libevent.org/ 
* libevent API:http://www.monkey.org/~provos/libevent/doxygen-2.0.1/index.html
* CSDN上剖析得很赞的文章:http://blog.csdn.net/sparkliang/article/details/4957667

// =============================================================================================

下面写了2个简单的使用例子,一个是定时器,一个是TCP服务器,都只涉及到libevent的事件管理模块。

一、简单定时器:实现程序每秒输出一个“Game Over!”

event_init() => evtimer_set() => event_add() =>event_dispatch()

    #include <stdio.h>
#include <iostream> // libevent头文件
#include <event.h>
using namespace std; // 定时事件回调函数
void onTime(int sock, short event, void *arg)
{
cout << "Game Over!" << endl; struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// 重新添加定时事件(定时事件触发后默认自动删除)
event_add((struct event*)arg, &tv);
} int main()
{
// 初始化
event_init(); struct event evTime;
// 设置定时事件
evtimer_set(&evTime, onTime, &evTime); struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// 添加定时事件
event_add(&evTime, &tv); // 事件循环
event_dispatch(); return 0;
}

编译并执行,编译加 -levent:

    gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest # mv time.cpp timer.cpp
gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest # g++ -o timer timer.cpp -levent
gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest # ./timer
Game Over!
Game Over!
Game Over!
Game Over!

二、TCP服务器:实现监听本机8888端口并输出客户端发送过来的信息

event_base_new()=>event_set()=>event_base_set()=>event_add()=>event_base_dispatch()

    #include <stdio.h>
#include <string.h>
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h> #include <event.h>
using namespace std; // 事件base
struct event_base* base; // 读事件回调函数
void onRead(int iCliFd, short iEvent, void *arg)
{
int iLen;
char buf[1500]; iLen = recv(iCliFd, buf, 1500, 0); if (iLen <= 0) {
cout << "Client Close" << endl; // 连接结束(=0)或连接错误(<0),将事件删除并释放内存空间
struct event *pEvRead = (struct event*)arg;
event_del(pEvRead);
delete pEvRead; close(iCliFd);
return;
} buf[iLen] = 0;
cout << "Client Info:" << buf << endl;
} // 连接请求事件回调函数
void onAccept(int iSvrFd, short iEvent, void *arg)
{
int iCliFd;
struct sockaddr_in sCliAddr; socklen_t iSinSize = sizeof(sCliAddr);
iCliFd = accept(iSvrFd, (struct sockaddr*)&sCliAddr, &iSinSize); // 连接注册为新事件 (EV_PERSIST为事件触发后不默认删除)
struct event *pEvRead = new event;
event_set(pEvRead, iCliFd, EV_READ|EV_PERSIST, onRead, pEvRead);
event_base_set(base, pEvRead);
event_add(pEvRead, NULL);
} int main()
{ int iSvrFd;
struct sockaddr_in sSvrAddr; memset(&sSvrAddr, 0, sizeof(sSvrAddr));
sSvrAddr.sin_family = AF_INET;
sSvrAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sSvrAddr.sin_port = htons(8888); // 创建tcpSocket(iSvrFd),监听本机8888端口
iSvrFd = socket(AF_INET, SOCK_STREAM, 0);
bind(iSvrFd, (struct sockaddr*)&sSvrAddr, sizeof(sSvrAddr));
listen(iSvrFd, 10); // 初始化base
base = event_base_new(); struct event evListen;
// 设置事件
event_set(&evListen, iSvrFd, EV_READ|EV_PERSIST, onAccept, NULL);
// 设置为base事件
event_base_set(base, &evListen);
// 添加事件
event_add(&evListen, NULL); // 事件循环
event_base_dispatch(base); return 0;
}

来自:http://blog.csdn.net/yyyiran/article/details/12219737

libevent简介和使用【转】的更多相关文章

  1. libevent简介 构成

    libevent简介 libevent是一个事件驱动的网络库,支持跨平台,如Linux, *BSD, MacOS X, Solaris, Windows.支持I/O多路复用,epoll.poll./d ...

  2. libevent简介

    一.参考资料 1.ubuntu下安装libevent 2.libevent实现TCP 服务端

  3. [转]libevent简介和使用

    libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库. 总体来说,libevent有下面一些特点和优势:* 事件驱动,高性能:* 轻量级,专注于网络: * 跨平 ...

  4. Libevent教程001: 简介与配置

    本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...

  5. 【传智播客】Libevent学习笔记(一):简介和安装

    目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...

  6. libevent源码深度剖析

    原文地址: http://blog.csdn.net/sparkliang/article/details/4957667 第一章 1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多 ...

  7. 以libevent网络库为引:网络通信和多线程

    1. windows下编译及使用libevent  http://www.cnblogs.com/luxiaoxun/p/3603399.html 2.  <<libevent学习资料&g ...

  8. libevent的入门学习-库的安装【转】

    转自:https://blog.csdn.net/lookintosky/article/details/61658067 libevent的入门学习-库的安装最近开始接触Linux应用层的东西,发现 ...

  9. libevent(了解)

    1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析, ...

随机推荐

  1. python 求两个时间差

    def timeInterval(self): today = datetime.date.today() print today modifiedTime = os.stat(filename).s ...

  2. 【转】iBatis.Net的SqlMap.config文件

    转自:http://www.xuebuyuan.com/579671.html   iBatis.Net基本的运行环境配置主要由两个文件组成,分别是SqlMap.config和Provider.con ...

  3. 阿里大鱼短信发送,放到项目中报错Java.lang.NoClassDefFoundError:com/aliyuncs/exceptions/ClientException,已解决

    由于项目中使用的短信服务发送的消息太慢,所以把采用了阿里大鱼的短信服务,花费了几个小时,通过审核,发现可以单独运行.但是,放到web项目中会报错(Java.lang.NoClassDefFoundEr ...

  4. 解题:SCOI 2008 配对

    题面 如果没有两个数不能相同这个限制就两个数组排序后贪心即可.现在加上这个限制,注意到每个数组中的数是两两不同的,所以每次一定能在前面或后面一个数中找一个换过来,这样每次考虑相邻三个数转移就可以了,注 ...

  5. 关于[x/y]一些小想法

    [x/y],即x除以y下取整 (不会LATEX) 1.对于给定的x,对于所有的1<=y<=x, [x/y]一共有√x种取值. 证明: 对于y<=√x,y有根号种,所以值最多根号种.对 ...

  6. 简短的创建Ajax对象代码

    假如你的脚本只针对某个浏览器开发,那么创建XMLHTTP是很简单的一件事,用XMLHttpRequest或者ActiveXObject即可.但事实上绝大多数的时候,我们都要考虑兼容,于是我们通常写成: ...

  7. MatConvNet+Matlab2017a+CUDA8.0安装

    安装过程参照MatConvNet官网给出的步骤: http://www.vlfeat.org/matconvnet/install/ 1.安装CUDA8.0+cudnn6.0 参见之前的博客 2.安装 ...

  8. BAYES和朴素BAYES

    0 前言  朴素贝叶斯算法仍然是流行的十大挖掘算法之一,该算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资.信用等级评定等多分类问题.该算法的优点在于简单易懂.学习效率高.在某些 ...

  9. bzoj 5301 [Cqoi2018]异或序列 莫队

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 155[Submit][Status ...

  10. 编译geth报错的解决方法 make: *** [geth] 错误 1

    在centos下安装了go1.9.1版本,编译go-ethereum时报错: [root@localhost go-ethereum]# make gethbuild/env.sh go run bu ...