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\n");
        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\n");
    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 \n");
    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] = '\0';
    printf("recv %s from server\n", msg);
}

typedef struct sockaddr SA;
int tcp_connect_server(const char* server_ip, int port)
{
   
    int sockfd, status, save_errno;
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr) );
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    status = inet_aton(server_ip, &server_addr.sin_addr);
    if( status == 0 ) //the server_ip is not valid value
    {
   
        errno = EINVAL;
        return -1;
    }
    sockfd = ::socket(PF_INET, SOCK_STREAM, 0);
    if( sockfd == -1 )
        return sockfd;
    status = ::connect(sockfd, (SA*)&server_addr, sizeof(server_addr) );
   
    if( status == -1 )
    {
   
        save_errno = errno;
        ::close(sockfd);
        errno = save_errno; //the close may be error
        return -1;
    }
    evutil_make_socket_nonblocking(sockfd);
    return sockfd;
}

服务器代码

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<even
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值