Linux中使用libevent服务端和客户端的通信(安装libevent过程,并解决编译后找不到libvent的so的问题,详细截图)

13 篇文章 0 订阅
3 篇文章 0 订阅

libevent

libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。

它被众多的开源项目使用,如memcached等。
特点:
事件驱动,高性能;
轻量级,专注于网络(相对于ACE);
开放源码,代码相当精炼、易读;
跨平台,支持Windows、Linux、BSD和Mac OS;
支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务;
支持I/O,定时器和信号等事件;

Reactor模式

libevent是一个典型的reactor模式的实现。
普通的函数调用机制:程序调用某个函数,函数执行,程序等待,函数将结果返回给调用程序(如果含有函数返回值的话),也就是顺序执行的。
Reactor模式的基本流程:应用程序需要提供相应的接口并且注册到reactor反应器上,如果相应的事件发生的话,那么reactor将自动调用相应的注册的接口函数(类似于回调函数)通知你,所以libevent是事件触发的网络库。

Linux下libevent主要API

创建事件集
struct event_base *event_base_new(void);

创建事件
struct event event_new (struct event_base ,evutil_socket_t ,short ,event_callback_fn, void*)

添加事件
int event_add(struct event * ev,const struct timeval* timeout)

删除事件
int event_del(struct event *)

事件循环
int event_base_loop(struct event_base *base, int flags)
int event_base_dispatch(struct event_base *event_base)

libevent官网

http://libevent.org/

  1. 首先我们先来安装这个libevent,跟着我以下的步骤来进行

进入到官网,就会看到以下页面,然后右键点击要安装的版本
在这里插入图片描述

现在进入到我们的Linux系统,首先用sudo su命令进入root用户

使用命令(要有网络的情况下才能下载)
wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
在这里插入图片描述
下载成功就看到
在这里插入图片描述
然后将这个文件解压用tar zxvf libevent-2.1.12-stable.tar.gz命令 (注意根据自己下载的版本)
在这里插入图片描述
在这里插入图片描述
解压成功之后我们就可以进入libevent-2.1.12-stable这个目录里面去了

进入目录之后就会看到很多文件
在这里插入图片描述
然后执行 ./configure --disable-openssl 这个命令配置安装路径
在这里插入图片描述

看到上面这个说明配置成功了

然后再执行make
在这里插入图片描述
在这里插入图片描述
make成功之后,再执行make install命令
在这里插入图片描述经过以上步骤就成功安装libevent了

怎么查看libevent是否安装成功呢,我们可以执行
ls -la /usr/local/include | grep event这个命令看查看

在这里插入图片描述

我这边呢,准备了一个测试代码(只是部分代码截图)
在这里插入图片描述
在这里插入图片描述
编译时后面需要带上 -levent
在这里插入图片描述

编译成功之后,我们执行这个文件的时候,就会看到这个错误!!!(当然,有的可能没有这个错误)
在这里插入图片描述
在这里插入图片描述
这个是执行后的程序提示找不到libvent的so,则创建库的链接和缓存文件,那么怎么解决这个问题呢?

其实解决这个问题很简单,我们只要输入 ldconfig 命令就可以了
在这里插入图片描述

这样就可以解决了,然后接下来就可以进行执行我的程序了
在这里插入图片描述客户端通过telnet 和 ip + 端口号连接服务端
在这里插入图片描述
再客户端输入信息服务端接收
在这里插入图片描述
在这里插入图片描述

这样就实现了libevent的安装和解决编译执行的问题,如果有想要这个源码的可以在评论中留言

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
使用libevent库实现TCP/IP客户端服务端通信,可以按照以下步骤进行: 1. 引入libevent库的头文件和链接库。 ```c #include <event2/event.h> #include <event2/bufferevent.h> #include <event2/buffer.h> #include <event2/listener.h> #include <event2/util.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/socket.h> #include <fcntl.h> #pragma comment(lib, "event.lib") #pragma comment(lib, "event_core.lib") #pragma comment(lib, "event_extra.lib") ``` 2. 创建服务端监听器并设置回调函数。 ```c struct event_base* base = event_base_new(); // 创建event_base对象 // 创建监听器 struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(8888); struct evconnlistener* listener = evconnlistener_new_bind(base, accept_cb, NULL, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, 10, (struct sockaddr*)&sin, sizeof(sin)); // 设置回调函数 void accept_cb(struct evconnlistener* listener, evutil_socket_t fd, struct sockaddr* addr, int len, void* ptr) { struct event_base* base = evconnlistener_get_base(listener); struct bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev, read_cb, NULL, event_cb, NULL); bufferevent_enable(bev, EV_READ | EV_WRITE); } ``` 3. 创建客户端并连接到服务端。 ```c struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(8888); inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr); // 创建事件对象 struct event_base* base = event_base_new(); struct bufferevent* bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev, read_cb, NULL, event_cb, NULL); // 连接服务端 bufferevent_socket_connect(bev, (struct sockaddr*)&sin, sizeof(sin)); ``` 4. 设置读写回调函数。 ```c void read_cb(struct bufferevent* bev, void* ctx) { struct evbuffer* input = bufferevent_get_input(bev); size_t len = evbuffer_get_length(input); char* data = (char*)malloc(len + 1); memset(data, 0, len + 1); evbuffer_copyout(input, data, len); printf("recv: %s\n", data); free(data); evbuffer_drain(input, len); } void event_cb(struct bufferevent* bev, short events, void* ctx) { if (events & BEV_EVENT_EOF) { printf("connection closed\n"); } else if (events & BEV_EVENT_ERROR) { printf("some other error\n"); } bufferevent_free(bev); } ``` 5. 启动事件循环。 ```c event_base_dispatch(base); ``` 这样就可以使用libevent库实现TCP/IP客户端服务端通信了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随你而归的云彩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值