libevent库学习(1)

article/2025/9/10 13:08:11

一、初识

1、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等等。

2、安装

官网:libevent

我这里用的是2.1.8版本,linux使用的是ubuntu20.4。使用原码安装。

(1)解压
(2)./configure              # 检查安装环境 生成 makefile
(3)make                     # 生成 .o 和 可执行文件
(4)sudo make install        # 将必要的资源cp置系统指定目录。

3、检查是否安装成功

进入sample路径下

 这里有一些小demo可以测试书否安装成功

 这样即表示安装成功。

4、查看安装路径

 头文件在include里面

5、框架相关的不常用函数

查看支持哪些多路io

/*************************************************************************> File Name: 01event.c> Author: Winter> Created Time: 2022年02月17日 星期四 20时58分11秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <event2/event.h>int main(int argc, char* argv[])
{struct event_base* base = event_base_new();               // 创建baseint i;const char** buff1;buff1 = event_get_supported_methods();       // 查看支持哪些多路iofor (i  = 0; i < 10; i++) {printf("buff1[i] = %s\n", buff1[i]);}return 0;
}

 注意编译时,添加-levent

查看当前使用的多路IO

/*************************************************************************> File Name: 01event.c> Author: Winter> Created Time: 2022年02月17日 星期四 20时58分11秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <event2/event.h>int main(int argc, char* argv[])
{struct event_base* base = event_base_new();               // 创建basconst char *buff2;buff2 = event_base_get_method(base);                      // 查看当前使用的多路IOprintf("buff2 = %s\n", buff2);return 0;
}

二、libevent封装的框架思想

1、libevent框架

1. 创建 event_base		(乐高底座)
2. 创建 事件evnet	
3. 将事件 添加到 base上	
4. 循环监听事件满足
5. 释放 event_base

(1)创建 event_base       (乐高底座)

struct event_base *event_base_new(void);
struct event_base *base = event_base_new();

(2)创建 事件evnet

创建事件分为两种:常规事件(event_new)和带缓冲区的事件(bufferevent_socket_new)

常规事件            event	--> event_new(); 
带缓冲区的事件      bufferevent --> bufferevent_socket_new();

(3)将事件 添加到 base上

int event_add(struct event *ev, const struct timeval *tv)

(4)循环监听事件满足

int event_base_dispatch(struct event_base *base);

(5)释放 event_base

event_base_free(base);

2、使用fifo读写(常规事件)

创建事件event

struct event *event_new(struct event_base *base,evutil_socket_t fd,short what event_callback_fn cb;  void *arg);参数:base: event_base_new()返回值fd: 绑定到 event 上的 文件描述符what:对应的事件(r、w、e)EV_READ		一次 读事件EV_WRTIE	一次 写事件EV_PERSIST	持续触发。 结合 event_base_dispatch 函数使用,生效。cb:一旦事件满足监听条件,回调的函数。typedef void (*event_callback_fn)(evutil_socket_t fd,  short,  void *)	arg: 回调的函数的参数。返回值:成功创建的 event

读操作

/*************************************************************************> File Name: myread.c> Author: Winter> Created Time: 2022年02月18日 星期五 21时07分03秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <event2/event.h>// 回调函数
void read_cb(evutil_socket_t fd, short what, void* arg) {// 读管道char buff[1024] = {0};int len = read(fd, buff, sizeof(buff));printf("read event : %s \n", what & EV_READ ? "YES" : "NO");printf("data len = %d, buff = %s\n", len, buff);sleep(1);
}int main(int argc, char* argv[])
{unlink("myfifo");// 创建有名fifoint res = mkfifo("myfifo", 0664);if (res == -1) {perror("mkfifo error\n");exit(1);}// 打开fifoint fd = open("myfifo", O_RDONLY | O_NONBLOCK);        // 非阻塞只读if (fd == -1) {perror("open error\n");exit(1);}// 创建event_basestruct event_base* base = event_base_new();// 创建事件     EV_PERSIST是持续读struct event* ev = event_new(base, fd, EV_READ | EV_PERSIST, read_cb, NULL);// struct event* ev = event_new(base, fd, EV_READ, read_cb, NULL);// 添加事件event_add(ev, NULL);// 事件循环event_base_dispatch(base);               // while (1) {  epoll }// 释放资源event_free(ev);event_base_free(base);close(fd);return 0;
}

写操作

/*************************************************************************> File Name: mywrite.c> Author: Winter> Created Time: 2022年02月18日 星期五 21时24分04秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <event2/event.h>
#include <fcntl.h>// 回调函数
void write_cb(evutil_socket_t fd, short what, void* arg) {// 写管道char buff[1024] = {0};static int num = 0;sprintf(buff, "hello world - %d", num++);write(fd, buff, strlen(buff) + 1);sleep(1);
}int main(int argc, char* argv[])
{// 与myread.c配套,但是要先打开myread程序// 打开管道int fd = open("myfifo", O_WRONLY | O_NONBLOCK);if (fd == -1) {perror("open error\n");exit(1);}// 创建event_basestruct event_base* base = event_base_new();// 创建写事件   EV_PERSIST是持续写struct event* ev = event_new(base, fd, EV_WRITE | EV_PERSIST, write_cb, NULL);// struct event* ev = event_new(base, fd, EV_WRITE, write_cb, NULL);// 添加事件event_add(ev, NULL);// 事件循环event_base_dispatch(base);// 释放资源event_free(ev);event_base_free(base);close(fd);return 0;
}

测试

 这里只测试了带有EV_PERSIST参数的event_new函数。


http://chatgpt.dhexx.cn/article/xLCilLxc.shtml

相关文章

详解Libevent网络库

项目中要用到libevent&#xff0c;所以就自学了libevent&#xff0c;参考资料为张亮的《libevent源码深度剖析》和《linux高性能服务器编程》 Libevent简介 Libevent是开源社区一款高性能的I/O框架库&#xff0c;其具有如下特点&#xff1a; 1.跨平台支持。Libevent支持Linu…

Libevent库的介绍与应用

Libevent库 Libevent概述Libevent使用模型Libevent库使用示例Libevent事件类型和框架结构使用Libevent完成tcp服务端 Libevent概述 Libevent是开源社区的一款高性能的I/O框架库&#xff0c;使用Libevent的著名案例有&#xff1a;高性能的分布式内存对象缓存软件memcached,Goog…

Linux c 开发 - libevent

目录 一、event_base 1. 创建event_base 2. 查看IO模型 3. 销毁event_base 4. 事件循环 event loop 5. event_base的例子 二、event 事件 1. 创建一个事件event 2. 释放event_free 3. 注册event 4.event_assign 5. 信号事件 6. event细节 三、Socket实例 四、Bu…

安装svn客户端

下载地址 下载 TortoiseSVN 我的网盘地址&#xff1a; 百度网盘 请输入提取码 提取码&#xff1a; em9s 1、安装客户端 双击运行&#xff1a; 点击【next】 点击【next】 选择好路径后&#xff0c;点击【next】 点击【install】安装 点击【finish】完成安装。安装完成后重…

SVN客户端配置--客户端

一、使用客户端软件连接SVN服务器 在项目文件夹中单击右键–>TortoiseSVN–>Repo-browser,并在弹出框中贴入URL&#xff08;svn://服务器IP&#xff09; 在图中指定的位置单击右键选择checkput 点击OK点击OK SVN的三大指令 指令名称Checkout①连接到SVN服务器②更新服务…

SVN客户端(TortoiseSVN)安装及使用说明

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SVN客户端(TortoiseSVN)安装及使用说明 ⏱️ 创作时间&#xff1a; 20…

ubuntu搭建SVN客户端,右击提交或更新

有时候我们会在Linux系统上搞开发&#xff0c;项目在SVN上&#xff0c;不搭建SVN环境搞起来比较麻烦&#xff0c;不用其他软件为载体实现右击提交更新等其他操作&#xff0c;不使用VsCode,IDE全家桶等为载体搭建插件形式的SVN&#xff0c;完全独立搭建 1&#xff1a;安装SVN客…

SVN客户端下载及安装

SVN客户端地址&#xff1a;https://osdn.net/projects/tortoisesvn/# 方法/步骤 官网下载tortoisesvn&#xff0c;下载完成之后&#xff0c;如下图所示&#xff1a; 点击安装进入安装界面&#xff0c;点击接受协议&#xff0c;如下图所示&#xff1a; 选择安装的地址&…

【转】Ubuntu中SVN客户端安装+使用

转自&#xff1a;Ubuntu中SVN客户端安装使用_三少GG-CSDN博客 1、 安装 svn客户端&#xff1a; apt-get install subversion&#xff0c;然后根据提示一步一步&#xff0c;就完成了 svn的安装。当然&#xff0c;也可以源码安装 svn&#xff0c;下载 subversion 一个最新版本的源…

SVN客户端

SVN是Subversion的简称&#xff0c;是一个开源的代码版本控制系统 SVN客户端操作 checkout 检出&#xff1a;初次下载-第一次连接svn服务器时候需要下载对应仓库的数据&#xff08;如果仓库中有数据的话&#xff09;add 新增&#xff1a;新增数据到svn服务器update 更新&#x…

【SVN】windows下的SVN客户端访问ubuntu下的SVN服务器

目录 第一部分 windows创建本地版本库、连接ubuntu的SVN服务器 步骤0&#xff1a; 步骤一&#xff1a;创建windows本地版本库 步骤二&#xff1a;checkout检测 步骤三&#xff1a;输入之前配置的用户名和密码 第二部分 windows上传文件至SVN服务器 步骤一&#xff1a;添加…

SVN 客户端下载与安装

SVN 客户端下载与安装 svn 客户端下载地址&#xff1a;https://tortoisesvn.net/downloads.zh.html 1. 网址截图 2. 汉化包下载安装 下载完毕&#xff0c;双击安装&#xff0c;下一步即可&#xff08;可根据需要进行安装路径选择&#xff09;

windows环境下的svn客户端(VisualSVN Server),服务端(TortoiseSVN),中文化(TortoiseSVN LanguagePack_1.9.7.2)安装和使用(超详细)

一、下载安装包 1.VisualSVN server 服务端下载&#xff1a;VisualSVN Server 2.svn客户端下载&#xff1a;TortoiseSVN 3.中文化包下载&#xff1a;TortoiseSVN LanguagePack_1.9.7.27907-x64-zh_CN中文包 二、安装软件 1.安装VisualSVN server 服务端&#xff1a; &#xf…

SVN客户端安装及操作文档

第一部分&#xff1a;客户端安装 1 在D盘创建svnclient文件夹&#xff0c;并将svn安装包复制到svnclient文件夹中 2 客户端安装 双击文件“TortoiseSVN-1.14.1.29085-x64-svn-1.14.1.msi” 点击“Next” 点击“Next” 点击“Browse”选择安装路径&#xff0c;这里将安装路径…

12306图片验证码效果实现

效果如下&#xff1a; 原理&#xff1a;从服务器获取的图片上&#xff0c;我们画上自己的图片&#xff0c;然后再显示出来。 核心代码如下在处理imageview点击事件前做如下操作&#xff1a; Bitmap bitmap BitmapFactory.decodeResource(getResources(), R.mipmap.yanzheng)…

利用神经网络识别12306验证码—(六)模型应用以及12306实战测试

模型训练好之后&#xff0c;就可以应用于新图片的预测了。比如现在有下面这么一张12306的验证码&#xff0c;预测工作也分为两部分&#xff1a;上半部分的文字预测、下半部分的图片预测&#xff0c;将两部分划分开之后分别加载各自的模型进行预测。 文字预测&#xff1a;需要把…

php实现12306验证码,PHP仿12306图片验证码

生成验证码的demo使用模型model读取图库&#xff0c;有需要对接框架的朋友可以自己修改&#xff0c;如下&#xff1a; # 引入测试的数据库model require_once dirname(__FILE__)./Model.php; # 引入验证码核心类库 require_once dirname(dirname(__FILE__))./vendor/Vif.php; $…

python 爬取12306验证码

一个简单的验证码爬取程序 本文介绍了在Python2.7环境下爬取网站验证码&#xff1a; 思路就是获取验证码对应的url&#xff0c;然后发起requst请求&#xff0c;读取该URL对应的内容&#xff0c;然后写入到一个本地文件&#xff0c;实现一个验证码的保存。大量下载可以把以上程…

利用百度AI平台识别12306验证码

简单的利用百度AI平台做一个12306的验证码识别。 第一步&#xff1a;先进行图片预处理 提取文字部分 import numpy as np#分割文字 def get_img_text(img,offset0):return img[3:22,120offset:177offset]#分割图片 def _get_imgs(img):interval 5length 66img_array np.em…

12306验证码为什么那么变态?都是这项深度学习应用给逼的

导读&#xff1a;12306为什么要设置那么复杂的验证码机制呢&#xff1f;就是因为OCR。 今天聊OCR。 OCR是人工智能、机器学习特别是深度学习&#xff0c;在图像识别方向最为重要的应用之一。OCR全称Optical Chararcter Recogition&#xff0c;中文翻译为光学字符识别&#xff0…