转自: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

转载于:https://www.cnblogs.com/sky-heaven/p/8563074.html

libevent简介和使用【转】相关推荐

  1. libev libevent简介

    最近开始重构定制公司的网站后台服务器,开始关注libevent 以及livev 相关 ,也欢迎相关的同学一起讨论.这两者采用相同的架构和设计思想,很多原理和代码都可以相互参考和对比理解. 简介 lib ...

  2. libevent简介和使用

    libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库,今天学习下. 总体来说,libevent有下面一些特点和优势: * 统一数据源, 统一I/O事件,信号和定 ...

  3. cocos2dx libevent简介和使用

    From: http://blog.csdn.net/kaitiren/article/details/35254577 libevent是一个基于事件触发的网络库,memcached底层也是使用li ...

  4. Libevent简介

    Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼 ...

  5. linux 查看libevent 安装目录,linux下libevent安装配置与简介 以及 linux库文件搜索路径的配置...

    libevent简介 libevent是基于Reactor模式的I/O框架库,它具有良好的跨平台性和线程安全,它实现了统一事件源(即对I/O事件.信号和定时事件提供统一的处理).高性能分布式内存对象缓 ...

  6. 【Libevent】Libevent学习笔记(一):简介和安装

    00. 目录 文章目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 05. 参考资料 01. l ...

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

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

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

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

  9. libevent源码深度剖析

    原文地址:http://blog.csdn.net/sparkliang/article/details/4957667 libevent源码深度剖析一 --序幕 张亮 1 前言 Libevent是一 ...

最新文章

  1. 【ZZ】IPv4与IPv6
  2. 安卓高级6 拍照或者从相册获取图片 并检测旋转角度或者更新画册扫描
  3. 推荐系统炼丹笔记:令人着迷的时间动态CF算法
  4. Linux 终端下 dstat 监控工具
  5. java中对象的初始化过程
  6. python代码进去docker容器内_python脚本监控docker容器
  7. 简单实现Popup弹出框添加数据
  8. python场景应用方向_python的应用场景及学习方向
  9. fatal error LNK _X
  10. 如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作
  11. redis key操作大全
  12. 企业级无线无缝漫游之思创漫游3.0 Plus ,三层漫游
  13. Nginx同一个域名下代理后端项目跟多个vue项目
  14. 轻度折腾nuc8i5beh
  15. 踩坑系列之 memcache的有效期
  16. PPC活动的优化利用Prosper202
  17. 【C#】记录一次上位机软件界面闪退分析及解决方案
  18. 安装Photon虚拟机
  19. MyZip--专业mac压缩软件
  20. 【SpringBoot】学生信息查询案例

热门文章

  1. 你真的很熟分布式和事务吗?
  2. 虚拟化的发展历程和实现原理——图文详解
  3. MYSQL查看执行计划 Explain
  4. Java异常处理和设计
  5. Python IDLE无法显示行号、Python IDLE shell里运行py文件
  6. Mysql (二)Mysql 数据库表增删改查
  7. 一道比较实用的MySQL面试题:游戏数据充值查询
  8. 在Asp.Net MVC中使用ModelBinding构造Array、List、Collection以及Dictionary
  9. 如何在64位的windows平台上安装需要c编译的python扩展库
  10. C#封装类似任务管理器CPU使用记录图