Linux下Libevent安装和简单实用
Posted WindSun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下Libevent安装和简单实用相关的知识,希望对你有一定的参考价值。
前言
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等
Libevent下载和安装
1. 下载
官方网站:http://libevent.org/,目前最新版是2.1
下载压缩包名为 libevent-2.1.11-stable.tar.gz
2. 解压
tar -zxvf libevent-2.1.11-stable.tar.gz
3. 配置安装路径
cd libevent-2.1.11-stable
./configure
也可以指定后缀,比如路径为./configure -prefix=/usr
4. 编译安装
make
make install
5. 测试是否已安装
ls -al /usr/local/lib | grep libevent
6. 使用样例程序进行测试
cd sample/
此目录下,有很多样例,可以进行测试,也可以进行学习
使用Libevent编写简单的程序和编译
使用libevent库开发的程序,默认编译需要加入-levent
问题:如果在编译或运行时候发现出现:error while loading shared libraries: libevent-2.1.so.7: cannot open shared object file: No such file or directory
则需要查看libevent-2.1.so.7是否存在,需要先安装mlocate
locate libevent-2.1.so.7
结果: 系统已经安装了该模块,在路径 /usr/local/lib/
映射libevent-2.1.so.7到lib64下即可
ln -s /usr/local/lib/libevent-2.1.so.7 /usr/lib64/libevent-2.1.so.7
然后就可以正常的运行了
Libevent程序实例
初等
客户端代码
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<errno.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<event.h>
#include<event2/util.h>
int tcp_connect_server(const char* server_ip, int port);
void cmd_msg_cb(int fd, short events, void* arg);
void socket_read_cb(int fd, short events, void *arg);
int main(int argc, char** argv)
{
if( argc < 3 )
{
printf("please input 2 parameter
");
return -1;
}
//两个参数依次是服务器端的IP地址、端口号
int sockfd = tcp_connect_server(argv[1], atoi(argv[2]));
if( sockfd == -1)
{
perror("tcp_connect error ");
return -1;
}
printf("connect to server successful
");
struct event_base* base = event_base_new();
struct event *ev_sockfd = event_new(base, sockfd,
EV_READ | EV_PERSIST,
socket_read_cb, NULL);
event_add(ev_sockfd, NULL);
//监听终端输入事件
struct event* ev_cmd = event_new(base, STDIN_FILENO,
EV_READ | EV_PERSIST, cmd_msg_cb,
(void*)&sockfd);
event_add(ev_cmd, NULL);
event_base_dispatch(base);
printf("finished
");
return 0;
}
void cmd_msg_cb(int fd, short events, void* arg)
{
char msg[1024];
int ret = read(fd, msg, sizeof(msg));
if( ret <= 0 )
{
perror("read fail ");
exit(1);
}
int sockfd = *((int*)arg);
//把终端的消息发送给服务器端
//为了简单起见,不考虑写一半数据的情况
write(sockfd, msg, ret);
}
void socket_read_cb(int fd, short events, void *arg)
{
char msg[1024];
//为了简单起见,不考虑读一半数据的情况
int len = read(fd, msg, sizeof(msg)-1);
if( len <= 0 )
{
perror("read fail ");
exit(1);
}
msg[len] = '