博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libevent安装及使用
阅读量:6800 次
发布时间:2019-06-26

本文共 4477 字,大约阅读时间需要 14 分钟。

一、安装libevent

官网:http://libevent.org/

选择最新版本下载,我选择的是libevent-2.0.22-stable.tar.gz,然后安装README文件中描述的方法编译、安装即可。

./configuremakemake verify # 可选操作make install

二、使用libevent

示例1:回显服务器

/******************************************************************************** File Name        : echo.c* Author        : zjw* Email            : emp3XzA3MjJAMTYzLmNvbQo= (base64 encode)* Create Time    : 2015年07月14日 星期二 09时05分37秒*******************************************************************************/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 8080int debug = 0;struct client{ int fd; struct bufferevent *buf_ev;};int setnonblock(int fd){ int flags; flags = fcntl(fd, F_GETFL); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags);}void buf_read_callback(struct bufferevent *incoming, void *arg){ struct evbuffer *evreturn; char *req; req = evbuffer_readline(incoming->input); if (req == NULL) { return ; } evreturn = evbuffer_new(); evbuffer_add_printf(evreturn, "You said: %s\n", req); bufferevent_write_buffer(incoming, evreturn); evbuffer_free(evreturn); free(req);}void buf_write_callback(struct bufferevent *bev, void *arg){ }void buf_error_callback(struct bufferevent *bev, short what, void *arg){ struct client *client = (struct client*)arg; bufferevent_free(client->buf_ev); close(client->fd); free(client);}void accept_callback(int fd, short ev, void *arg){ int client_fd; struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); struct client *client; client_fd = accept(fd, (struct sockaddr*)&client_addr, &client_len); if (client_fd < 0) { perror("Client: accept() failed"); return ; } setnonblock(client_fd); client = calloc(1, sizeof(*client)); if (client == NULL) { perror("1 malloc failed"); } client->fd = client_fd; client->buf_ev = bufferevent_new(client_fd, buf_read_callback, buf_write_callback, buf_error_callback, client); bufferevent_enable(client->buf_ev, EV_READ);}int main(int argc, char **argv){ int socketlisten; struct sockaddr_in addresslisten; struct event accept_event; int reuse = 1; event_init(); socketlisten = socket(AF_INET, SOCK_STREAM, 0); if (socketlisten < 0) { fprintf(stderr, "Failed to create listen socket"); return 1; } memset(&addresslisten, 0, sizeof(addresslisten)); addresslisten.sin_family = AF_INET; addresslisten.sin_addr.s_addr = INADDR_ANY; addresslisten.sin_port = htons(SERVER_PORT); if (bind(socketlisten, (struct sockaddr*)&addresslisten, sizeof(addresslisten)) < 0) { fprintf(stderr, "Failed to bind"); return 1; } if (listen(socketlisten, 5) < 0) { fprintf(stderr, "Failed to listen to socket"); return 1; } setsockopt(socketlisten, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); setnonblock(socketlisten); event_set(&accept_event, socketlisten, EV_READ | EV_PERSIST, accept_callback, NULL); event_add(&accept_event, NULL); event_dispatch(); close(socketlisten); return 0;}

编译并运行该回显服务器:

gcc -o echo ./echo.c -levent./echo

但是在运行的时候提示找不到动态链接库,那么肯定是库放的路径,链接器找不到,所以翻看执行make install命令时把库安装在什么地方了。

如果再./configure时不指定--prefix=/usr,则默认会安装在/usr/local/lib路径下。所以需要创建软链接。

我的是64位系统,所以软链接应该创建在/usr/lib64目录下: n -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5 

然后再执行: ./echo 运行之后不会有提示,为了测试,可以保持该终端开着,另开一个终端,使用telnet来测试一下。

执行: telnet localhost 8080 

示例2:定时器

/******************************************************************************** File Name        : timer.c* Author        : zjw* Email            : emp3XzA3MjJAMTYzLmNvbQo= (base64 encode)* Create Time    : 2015年07月14日 星期二 10时00分08秒*******************************************************************************/#include 
#include
#include
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 evTimer; // 设置定时事件 evtimer_set(&evTimer, OnTime, &evTimer); struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; // 添加定时事件 event_add(&evTimer, &tv); // 事件循环 event_dispatch(); return 0;}

编译并运行该定时器: g++ -o timer ./timer.cpp -levent 

运行结果:

参考:

http://www.ibm.com/developerworks/cn/aix/library/au-libev/

http://www.open-open.com/lib/view/open1386510630330.html

转载地址:http://azywl.baihongyu.com/

你可能感兴趣的文章
区分execl与system——应用程序中执行命令
查看>>
Android实现登录小demo
查看>>
AgentWeb是基于Android WebView一个功能完善小型浏览器库
查看>>
开放数据中心联盟推8个云计算应用模型
查看>>
学习数据分析的“里程碑”是什么?
查看>>
零点之战!探访阿里巴巴8大技术专家,提前揭秘2017双11关键技术
查看>>
国家开发银行统一软件环境USE解决方案
查看>>
数据科学与DevOps之间的差距还有救吗?
查看>>
程序员必须知道的10大基础实用算法及其讲解
查看>>
信息化一周回顾:金融业大数据十大趋势
查看>>
Http、TCP/IP协议与Socket之间的区别
查看>>
ARM工控主板在驾考驾培智能终端的使用
查看>>
大数据开启“互联网+统计”新模式
查看>>
文思海辉:智慧数据避免企业成为大数据时代落伍者
查看>>
什么!建设数据中心还得看风水?
查看>>
如何通过SSH隧道实现 Windows Pass the Ticket攻击?
查看>>
破解“动物农场”高级间谍平台Dino
查看>>
隐私安全新动向:Facebook采用OpenPGP加密技术
查看>>
食品巨头康尼格拉:数据分析如何影响企业成本?
查看>>
迅雷发布“星域CDN” 做条颠覆市场的鲶鱼
查看>>