libevent 封装了低层最高效的网络模型,windows的compIO,linux下的epoll模型,freebsd的kqueue,提供统一的异步调用接口; 以事件方式驱动,chrome,memcached 都在使用该框架.
libevent 同时也支持DNS,HTTP协议和RPC调用框架
一. 定时器
#include <stdio.h> #include <event.h> void onTime(int sock,short event,void *arg) { printf("Game over!\n"); struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; // 事件执行后,默认就被删除,需要重新add,使之重复执行 event_add((struct event*)arg,&tv); } int main() { // 初始化事件 event_init(); // 设置定时器回调函数 struct event evTime; evtimer_set(&evTime,onTime,&evTime); struct timeval tv; // 1s后执行 tv.tv_sec = 1; tv.tv_usec = 0; // 添加事件 event_add(&evTime,&tv); // 循环派发事件 event_dispatch(); return 0; }
编译: gcc -o time_test time_test.c -I/usr/local/libevent/include -L/usr/local/libevent/lib -levent
二. TCP服务器
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <event.h> struct event_base *base; // 读事件 void onRead(int clifd,short ievent,void *arg) { int ilen; char buf[1500]; ilen = recv(clifd,buf,1500,0); if(ilen <= 0) { printf("Client close\n"); struct event *pread = (struct event*)arg; event_del(pread); delete pread; close(clifd); return; } buf[ilen] = '\0'; printf("Accpet: %s\n",buf); } // 连接事件 void onAccept(int svrfd,short ievent,void *arg) { int clifd; struct sockaddr_in cliaddr; socklen_t sinsize = sizeof(cliaddr); clifd = accept(svrfd,(struct sockaddr*)&cliaddr,&sinsize); struct event *pread = new event; event_set(pread,clifd,EV_READ|EV_PERSIST,onRead,pread); // 注册读(写)事件 event_base_set(base,pread); event_add(pread,NULL); } int main() { int svrfd; struct sockaddr_in svraddr; memset(&svrfd,0,sizeof(svraddr)); svraddr.sin_family = AF_INET; svraddr.sin_port = htons(1234); svraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); svrfd = socket(AF_INET,SOCK_STREAM,0); bind(svrfd,(struct sockaddr*)&svraddr,sizeof(svraddr)); listen(svrfd,10); // 初始化事件库 base = event_base_new(); // 初始化一个连接事件,EV_PRESIST指定重复执行该事件 struct event evlisten; event_set(&evlisten,svrfd,EV_READ|EV_PERSIST,onAccept,NULL); // 设置为base事件 event_base_set(base,&evlisten); // 添加事件 event_add(&evlisten,NULL); // 事件循环 event_base_dispatch(base); return 0; }
要实现windows下更高效的IOCP方式的API,IOCP在准备好读写事件时不会通知你的程序去拷贝数据,而时在数据完成从内核态拷贝到用户态时才通知应用程序. libevent 2提供了 bufferevent 接口,支持这种编程范式
三. HTTP服务器
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <event.h> #include <evhttp.h> void reqHandler(struct evhttp_request *req,void *arg) { struct evbuffer *buf = evbuffer_new(); // 发送响应 evbuffer_add_printf(buf, "Thanks for the request"); evhttp_send_reply(req,HTTP_OK,"Client",buf); evbuffer_free(buf); return; } int main(int argc,char **argv) { short port = 8000; const char *addr = "192.168.1.11"; struct evhttp *httpserv = NULL; event_init(); // 启动http服务 httpserv = evhttp_start(addr,port); // 设置回调 evhttp_set_gencb(httpserv, reqHandler,NULL); printf("Server started on port %d\n",port); event_dispatch(); return 0; }
浏览器访问: http://192.168.1.11:8000 会显示 Thanks for the request
原文参见: http://blog.csdn.net/yyyiran/article/details/12219737
相关推荐
libevent-2.0.22-stable.tar.gz源码编译的Windows和Linux下的静态库,另附源码,电子书《libevent参考手册(中文版).pdf》、《libevent源码深度剖析.pdf》、《LibeventBook.pdf》。 Linux环境下该libevent静态库修改...
cocos2dx libevent 使用,有需要的童鞋下载使用一下吧!
libevent参考手册(中文版),包含libevent的设计说明、原理描述,模块介绍和接口说明。
代码 libevent 使用
人才总结的,牛!简单使用的文档,快速入门libevent!
此案例主要实现了客户端与服务端的基本会话的功能,客户端发送消息给服务端,服务端回传给单个或所有客户端。 修改服务端中的全局变量 g_bSendAll 可控制服务端是否向当前所有已经连接的客户端发送消息。...
LibEvent文档\使用libevent编写linux服务
libevent使用libevent_pthreads库来提供线程安全支持。 4.基于reactor模式的实现。 课程通过多角度、深层次的教学及实践,带领同学们进行C++企业级网络开发实战和Libevent C++跨平台高级实战技术课程的学习。...
可移植性:使用 libevent 编写的程序应该可以在 libevent 支持的所有平台上工作。即使 没有好的方式进行非阻塞 IO,libevent 也应该支持一般的方式,让程序可以在受限的 环境中运行。 速度:libevent 尝试使用每个...
libevent官方手册,使用者可以根据查看
libevent-2.0.22-stable在windows环境下使用mingw编译
libevent2.1.7在Linux安装过程 ...libevent2.1.7在Linux安装过程需要遵循特定的步骤,包括解压缩源代码包、执行autoreconf命令、编译和安装libevent库、查看安装结果,并在QT或C环境中正确使用libevent库。
最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main...
关于异步程序开与与 libevent 的使用。
【最新】C++ 使用libEvent实现http的post, get功能,【最新】C++ 使用libEvent实现http的post, get功能
VS2013编译libevent2.1.8源码生成静态库,并编写使用libevent静态库的服务器测试程序,程序经测试可成功运行
可移植性:使用 libevent 编写的程序应该可以在 libevent 支持的所有平台上工作。即使 没有好的方式进行非阻塞 IO,libevent 也应该支持一般的方式,让程序可以在受限的 环境中运行。 速度:libevent 尝试使用每个...
linux下使用libevent实现断网重连的tcp客户端,自动检测tcp连接断开,断开后能自动重连;如果连不上服务器,则一直尝试连接服务器,直至连接成功。
文章介绍下libevent在socket异步编程中的应用
libevent库,文字版,很清晰,附带libevent参考手册(中文版) libevent源码深度剖析,根据libevent开源代码框架进行剖析,很不错值得学习借鉴,还有libevent中C语言的功底值得学习揣摩!