<pre class="html" name="code">libevent接口的使用是简单easy的、关键还是一些其他技术须要深入了解、如epoll!
以下文章来自open经验库:

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实现,包含server和client 一些资料:
* 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个简单的使用样例,一个是定时器,一个是TCPserver,都仅仅涉及到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:
查看源代码打印?
1 gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest # mv time.cpp timer.cpp 2 gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest # g++ -o timer timer.cpp -levent 3 gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest # ./timer 4 Game Over! 5 Game Over! 6 Game Over! 7 Game Over!
二、TCPserver:实现监听本机8888port并输出client发送过来的信息 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),监听本机8888port 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; }

libevent简单介绍和使用的更多相关文章

  1. libevent简单介绍

    http://blog.csdn.net/mafuli007/article/details/7476014 1      简介 主页:http://www.monkey.org/~provos/li ...

  2. C10K问题和Libevent库介绍

    http://blog.chinaunix.net/uid-20761674-id-75056.html 一.C10K的问题 C10K的问题在上个世纪90年代就被提出来了.大概的意思是当用户数超过1万 ...

  3. Cloudera impala简单介绍及安装具体解释

    一.Impala简单介绍 Cloudera Impala对你存储在Apache Hadoop在HDFS,HBase的数据提供直接查询互动的SQL.除了像Hive使用同样的统一存储平台,Impala也使 ...

  4. 服务器端IO模型的简单介绍及实现

    https://mp.weixin.qq.com/s?src=3&timestamp=1541726441&ver=1&signature=xPSye3v7miF7aVeLHb ...

  5. Memcached简单介绍

    Memcached简单介绍 简介:Memcached是一个自由开源的,高性能,分布式内存对象缓存系统.================================================= ...

  6. 服务器端IO模型的简单介绍及实现 阻塞 / 非阻塞 VS 同步 / 异步 内核实现的拷贝效率

    小结: 1.在多线程的基础上,可以考虑使用"线程池"或"连接池","线程池"旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲 ...

  7. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  8. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  9. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

随机推荐

  1. 虽然net人

    http://v.qq.com/boke/page/c/h/0/c01173tzeh0.html http://v.qq.com/boke/page/r/7/x/r0117l07r7x.html ht ...

  2. Excel连接到MySQL,将Excel数据导入MySql,MySQL for Excel,,

    Excel连接到MySQL 即使当今时代我们拥有了类似微软水晶报表之类的强大报表工具和其他一些灵活的客户管 理应用工具,众多企业在分析诸如销售统计和收入信息的时候,微软的Excel依然是最常用的工具. ...

  3. [置顶] ios 360度旋转效果demo

    demo功能:用UIimageView实现360度旋转效果. demo说明:iPhone6.1 测试成功.主要代码在:FVImageSequence.m中.在touchesMoved事件中,通过替换U ...

  4. HDU1163【九余数定理】【水题】

    Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  5. Hive实现oracle的Minus函数

    在Oracle中minus运算的主要功能是: 在进行两个表格或者两个查询结果的时候,返回在第一个表格/查询结果中与第二个表格/查询结果不同样的记录. 结果不同样的记录包括两种情况:A,B 表中某一行的 ...

  6. Cpu实验

    实验十一.基于符合ISO/IEC 7816 标准协议的CPU卡RATS.PPS请求指令操作 实验目的 1.学习和了解ISO/IEC 7816标准. 2.学习和了解ATS各字节的具体定义. 3.学习和了 ...

  7. Identifiers

    Identifier An identifier is an arbitrarily long sequence of digits, underscores, lowercase and upper ...

  8. java中将list、map对象写入文件

    链接地址:http://blog.sina.com.cn/s/blog_4a4f9fb50101p6jv.html     推荐:凤爪女瓜子男怪象该谁反思伦敦房价为什么持续暴涨 × wvqusrtg个 ...

  9. PyQt中如何结合Qt设计师进行开发

    t设计师是Qt的所见即所得的界面设计工具,通过拖拉方式设计界面,但它并不能产生任何代码. Qt设计师使用.ui后缀的XML文件来存储界面内容.通过pyuic4命令可以编译成.py文件,.py文件的内容 ...

  10. UASCO Zero Sum DFS + Stack

    给一个N 表示1 2 3 ...N 求出所有 zero sum的情况 [简单Dfs 即可] 运算结果的时候我使用了一个stack... 比如N = 7 那么要求输出 1+2-3+4-5-6+7 1+2 ...