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()

  1. #include <stdio.h>
  2. #include <iostream>
  3.  
  4. // libevent头文件
  5. #include <event.h>
  6. using namespace std;
  7.  
  8. // 定时事件回调函数
  9. void onTime(int sock, short event, void *arg)
  10. {
  11. cout << "Game Over!" << endl;
  12.  
  13. struct timeval tv;
  14. tv.tv_sec = 1;
  15. tv.tv_usec = 0;
  16. // 重新添加定时事件(定时事件触发后默认自动删除)
  17. event_add((struct event*)arg, &tv);
  18. }
  19.  
  20. int main()
  21. {
  22. // 初始化
  23. event_init();
  24.  
  25. struct event evTime;
  26. // 设置定时事件
  27. evtimer_set(&evTime, onTime, &evTime);
  28.  
  29. struct timeval tv;
  30. tv.tv_sec = 1;
  31. tv.tv_usec = 0;
  32. // 添加定时事件
  33. event_add(&evTime, &tv);
  34.  
  35. // 事件循环
  36. event_dispatch();
  37.  
  38. return 0;
  39. }

编译并执行,编译加 -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!

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

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <netdb.h>
  8.  
  9. #include <event.h>
  10. using namespace std;
  11.  
  12. // 事件base
  13. struct event_base* base;
  14.  
  15. // 读事件回调函数
  16. void onRead(int iCliFd, short iEvent, void *arg)
  17. {
  18. int iLen;
  19. char buf[1500];
  20.  
  21. iLen = recv(iCliFd, buf, 1500, 0);
  22.  
  23. if (iLen <= 0) {
  24. cout << "Client Close" << endl;
  25.  
  26. // 连接结束(=0)或连接错误(<0),将事件删除并释放内存空间
  27. struct event *pEvRead = (struct event*)arg;
  28. event_del(pEvRead);
  29. delete pEvRead;
  30.  
  31. close(iCliFd);
  32. return;
  33. }
  34.  
  35. buf[iLen] = 0;
  36. cout << "Client Info:" << buf << endl;
  37. }
  38.  
  39. // 连接请求事件回调函数
  40. void onAccept(int iSvrFd, short iEvent, void *arg)
  41. {
  42. int iCliFd;
  43. struct sockaddr_in sCliAddr;
  44.  
  45. socklen_t iSinSize = sizeof(sCliAddr);
  46. iCliFd = accept(iSvrFd, (struct sockaddr*)&sCliAddr, &iSinSize);
  47.  
  48. // 连接注册为新事件 (EV_PERSIST为事件触发后不默认删除)
  49. struct event *pEvRead = new event;
  50. event_set(pEvRead, iCliFd, EV_READ|EV_PERSIST, onRead, pEvRead);
  51. event_base_set(base, pEvRead);
  52. event_add(pEvRead, NULL);
  53. }
  54.  
  55. int main()
  56. {
  57.  
  58. int iSvrFd;
  59. struct sockaddr_in sSvrAddr;
  60.  
  61. memset(&sSvrAddr, 0, sizeof(sSvrAddr));
  62. sSvrAddr.sin_family = AF_INET;
  63. sSvrAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  64. sSvrAddr.sin_port = htons(8888);
  65.  
  66. // 创建tcpSocket(iSvrFd),监听本机8888端口
  67. iSvrFd = socket(AF_INET, SOCK_STREAM, 0);
  68. bind(iSvrFd, (struct sockaddr*)&sSvrAddr, sizeof(sSvrAddr));
  69. listen(iSvrFd, 10);
  70.  
  71. // 初始化base
  72. base = event_base_new();
  73.  
  74. struct event evListen;
  75. // 设置事件
  76. event_set(&evListen, iSvrFd, EV_READ|EV_PERSIST, onAccept, NULL);
  77. // 设置为base事件
  78. event_base_set(base, &evListen);
  79. // 添加事件
  80. event_add(&evListen, NULL);
  81.  
  82. // 事件循环
  83. event_base_dispatch(base);
  84.  
  85. return 0;
  86. }

来自: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简介和使用【转】

    转自:http://www.open-open.com/lib/view/open1386510630330.html libevent是一个基于事件触发的网络库,memcached底层也是使用lib ...

  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. iOS学习之设计模式

    iOS开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

  2. 曲线参数化的Javascript实现(理论篇)

    在关键帧动画的制作过程中,动画师在k物体运动的过程中,一般要确定2个参数: 1)运动轨迹(表示物体运动的路径): 2)速度曲线(表示物体随时间的速度变化). 对于运动轨迹通常选用一定的样条曲线,通过动 ...

  3. mybatis中的#{}和${}

    #{}:相当于预处理中的占位符?. #{}里面的参数表示接收java输入参数的名称. #{}可以接受HashMap.简单类型.POJO类型的参数. 当接受简单类型的参数时,#{}里面可以是value, ...

  4. css width height

    css 中body 的默认宽度是100%,但是默认高度为0px

  5. 华为交换机sflow配置

    华为交换机sflow功能配置 1.配置交换机的sflow流发送 [系统视图]sflow agen ip  x.x.x.x                 设置sflow输出源 [系统视图]sflow ...

  6. Java随笔三

    1.接口: 1)接口不是类,不能使用new运算符实例化一个接口,而是对类的一组需求描述,这些类要遵循接口描述的统一格式进行定义.个人感觉像C语言中的函数在头文件中的预先声明,但是包含了一些类的特点,比 ...

  7. oc string

    转自http://www.cnblogs.com/CCSSPP/archive/2011/10/20/2218897.html 备用查看 NSLog(@"字符串处理"); //获得 ...

  8. dom扩展

    第十一章 DOM扩展 一.选择符API 1.querySelector()方法             接收一个CSS选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null. 2. ...

  9. 第三个Sprint冲刺事后诸葛亮报告

    用户反馈:还好吧. 用户数量:4 团队改进建议:思维局限太大,技术需要革新. 1.每个成员第一个sprint阶段有何需要改进? 成员 需要改进 邵家文 需要提高自己的工作效率,与创新能力,解决问题的能 ...

  10. IOS一些高效的第三方框架库

    MBProgressHUD ——进展指示符库 苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgres ...