[转]libevent简介和使用
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简介和使用的更多相关文章
- libevent简介 构成
libevent简介 libevent是一个事件驱动的网络库,支持跨平台,如Linux, *BSD, MacOS X, Solaris, Windows.支持I/O多路复用,epoll.poll./d ...
- libevent简介
一.参考资料 1.ubuntu下安装libevent 2.libevent实现TCP 服务端
- libevent简介和使用【转】
转自:http://www.open-open.com/lib/view/open1386510630330.html libevent是一个基于事件触发的网络库,memcached底层也是使用lib ...
- Libevent教程001: 简介与配置
本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...
- 【传智播客】Libevent学习笔记(一):简介和安装
目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...
- libevent源码深度剖析
原文地址: http://blog.csdn.net/sparkliang/article/details/4957667 第一章 1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多 ...
- 以libevent网络库为引:网络通信和多线程
1. windows下编译及使用libevent http://www.cnblogs.com/luxiaoxun/p/3603399.html 2. <<libevent学习资料&g ...
- libevent的入门学习-库的安装【转】
转自:https://blog.csdn.net/lookintosky/article/details/61658067 libevent的入门学习-库的安装最近开始接触Linux应用层的东西,发现 ...
- libevent(了解)
1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析, ...
随机推荐
- iOS学习之设计模式
iOS开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...
- 曲线参数化的Javascript实现(理论篇)
在关键帧动画的制作过程中,动画师在k物体运动的过程中,一般要确定2个参数: 1)运动轨迹(表示物体运动的路径): 2)速度曲线(表示物体随时间的速度变化). 对于运动轨迹通常选用一定的样条曲线,通过动 ...
- mybatis中的#{}和${}
#{}:相当于预处理中的占位符?. #{}里面的参数表示接收java输入参数的名称. #{}可以接受HashMap.简单类型.POJO类型的参数. 当接受简单类型的参数时,#{}里面可以是value, ...
- css width height
css 中body 的默认宽度是100%,但是默认高度为0px
- 华为交换机sflow配置
华为交换机sflow功能配置 1.配置交换机的sflow流发送 [系统视图]sflow agen ip x.x.x.x 设置sflow输出源 [系统视图]sflow ...
- Java随笔三
1.接口: 1)接口不是类,不能使用new运算符实例化一个接口,而是对类的一组需求描述,这些类要遵循接口描述的统一格式进行定义.个人感觉像C语言中的函数在头文件中的预先声明,但是包含了一些类的特点,比 ...
- oc string
转自http://www.cnblogs.com/CCSSPP/archive/2011/10/20/2218897.html 备用查看 NSLog(@"字符串处理"); //获得 ...
- dom扩展
第十一章 DOM扩展 一.选择符API 1.querySelector()方法 接收一个CSS选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null. 2. ...
- 第三个Sprint冲刺事后诸葛亮报告
用户反馈:还好吧. 用户数量:4 团队改进建议:思维局限太大,技术需要革新. 1.每个成员第一个sprint阶段有何需要改进? 成员 需要改进 邵家文 需要提高自己的工作效率,与创新能力,解决问题的能 ...
- IOS一些高效的第三方框架库
MBProgressHUD ——进展指示符库 苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgres ...