libevent安装及使用
一、安装libevent
官网:http://libevent.org/
选择最新版本下载,我选择的是libevent-2.0.22-stable.tar.gz,然后安装README文件中描述的方法编译、安装即可。
./configure
make
make verify # 可选操作
make install
二、使用libevent
示例1:回显服务器
/*******************************************************************************
* File Name : echo.c
* Author : zjw
* Email : emp3XzA3MjJAMTYzLmNvbQo= (base64 encode)
* Create Time : 2015年07月14日 星期二 09时05分37秒
*******************************************************************************/
#include <event.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h> #define SERVER_PORT 8080
int debug = ; 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 < )
{
perror("Client: accept() failed");
return ;
} setnonblock(client_fd); client = calloc(, 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 = ; event_init(); socketlisten = socket(AF_INET, SOCK_STREAM, );
if (socketlisten < )
{
fprintf(stderr, "Failed to create listen socket");
return ;
} memset(&addresslisten, , 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)) < )
{
fprintf(stderr, "Failed to bind");
return ;
} if (listen(socketlisten, ) < )
{
fprintf(stderr, "Failed to listen to socket");
return ;
} 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 ;
}
编译并运行该回显服务器:
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. /usr/lib64/libevent-2.0.so.
然后再执行: ./echo 运行之后不会有提示,为了测试,可以保持该终端开着,另开一个终端,使用telnet来测试一下。
执行: telnet localhost
示例2:定时器
/*******************************************************************************
* File Name : timer.c
* Author : zjw
* Email : emp3XzA3MjJAMTYzLmNvbQo= (base64 encode)
* Create Time : 2015年07月14日 星期二 10时00分08秒
*******************************************************************************/
#include <stdio.h>
#include <iostream>
#include <event.h> using namespace std; // 定时器事件回调函数
void OnTime(int sock, short event, void *arg)
{
cout << "Game Over!" << endl; struct timeval tv;
tv.tv_sec = ;
tv.tv_usec = ;
// 重新添加定时事件(定时事件触发后默认自动删除)
event_add((struct event*)arg, &tv);
} int main()
{
// 初始化
event_init(); struct event evTimer;
// 设置定时事件
evtimer_set(&evTimer, OnTime, &evTimer); struct timeval tv;
tv.tv_sec = ;
tv.tv_usec = ;
// 添加定时事件
event_add(&evTimer, &tv); // 事件循环
event_dispatch(); return ;
}
编译并运行该定时器: 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
libevent安装及使用的更多相关文章
- libevent安装总结 - jinfg2008的专栏 - 博客频道 - CSDN.NET
libevent安装总结 - jinfg2008的专栏 - 博客频道 - CSDN.NET libevent安装总结 分类: linux 系统配置 2013-02-13 22:37 99人阅读 评论( ...
- 总结libevent安装方法
1.先用:ls -al /usr/lib | grep libevent 查看是否已安装,如果已安装且版本低于1.3,则先通过:rpm -e libevent -nodeps 进行卸载. 2.下载l ...
- libevent 安装异常
有homebrew的可以使用 1 brew install memcached 这个命令来安装没有homebrew的可以直接手动安装1.去官网http://memcached.org/下载最新的包,然 ...
- libevent安装
libevent : 名气最大,应用最广泛,历史悠久的跨平台事件库:libev : 较libevent而言,设计更简练,性能更好,但对Windows支持不够好:libuv : 开发node的过程中需要 ...
- libevent安装后缺少libevent_openssl.so
最近要使用阿里的rocketmq,需要依赖libevent,所以下了个源码自己编译安装,安装过程按照readme来的: 1 ./configure 2 make 3 make install 但是安装 ...
- libevent安装方法
安装FastDFS之前,先安装libevent工具包,记录一下安装过程 1.检查:ls -al /usr/lib | grep libevent 查看是否已安装,如果已安装且版本低于1.3,则先通过: ...
- libevent安装总结
1.先用:ls -al /usr/lib | grep libevent 查看是否已安装:如果已安装且版本低于1.3,则先通过:rpm -e libevent —nodeps进行卸载. 2.下载lib ...
- Linux下Libevent安装和简单实用
前言 Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相 ...
- linux下libevent安装
wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz tar –xzvf libevent-1.4.13-stable.tar.gz ...
随机推荐
- Leetcode: Increasing Triplet Subsequence
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...
- jquery中的事件进阶
1.事件冒泡 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- spring中的bean后处理器
package com.process; import org.springframework.beans.BeansException; import org.springframework.bea ...
- java 网络编程(三)---TCP的基础级示例
下面是TCP java网络编程的基础示例: tcp传输:客户端建立过程的思路:1.创建TCP客户端的Socket服务,使用的是socket对象,建议在创建的过程中,就明确了目的地和要连接的主机2.如果 ...
- Android学习参考
收到一些朋友的微博私信,说能不能给Android新手们一些指导,我只能说指导谈不上,毕竟我也很多东西正在学习中,与此同时一大学同学准备转行Android,可以说是从头开始,那么我就姑且以一个过来人的身 ...
- 【NOIP模拟赛】lover——心上人
心上人 [问题描述] 人到初三,总会遇到情感问题,比方说小 J 就喜欢上了小 W.于是小 J 就需要说一长串的话讨小 W 欢心.现在已知小 W 听到一些词就会很高兴,而且白听不厌,但她又讨厌小 J ...
- 【海岛帝国系列赛】No.1 海岛帝国:诞辰之日
50111117海岛帝国:诞辰之日 [试题描述] YSF自从上次“被盗投降”完(带着一大堆债)回去以后,YSF对“海盗”怀念至今,他想要建立一个“药师傅”海岛帝国. 今天,他要像“管理部”那样去探寻 ...
- OpenStack 界面开发中的排序问题
Contents [hide] 1 需求 2 调研 3 排序的办法 4 解决代码 需求 获取主机列表的时候,希望能够对主机列表能分组显示,比如网络,一组网络段希望在一起显示 调研 openstack的 ...
- git使用记录(新手入门)
最近参与了公司的项目开发,最后要用git来把代码添加到远程库,但是没怎么接触过git,记录一下使用的流程 首先,当然是先下载git,这个略过不提,下载完之后,在你想要保存代码的目录下,用git ini ...
- 关于学习keynote
下午在学习如何用keynote写出高大上的文档,看到公司内的一个妹纸洋洋洒洒的写了好多篇文章,顿时觉得自己的知识面狭窄,文科女和理科女的差别,从我嘴里半天吐不出一个富有诗情画意的词句来,那么还是脚踏实 ...