libevent源码学习笔记
libevent源码学习笔记
- libevent安装
- libevent源码解析
- (1)事件对象
- (2)事件操作
- (3)事件循环
- (4)事件处理
- 常用指令
- 问题记录
- 问题一:长连接的管理
- 问题二:连接关闭问题
- 问题三:客户端与服务器端存在多个TCP连接,数据发送是依次的还是并行的?
libevent安装
(1)解压libevent压缩包并进入到文件目录下
·tar -zxvf libevent-2.1.12-stable.tar.gz
·cd libevent-2.1.12-stable.tar/

(2)运行./configure用于配置编译选项和环境,由于系统中没有OpenSSL库,所以使用了–disable-openssl选项来禁用OpenSSL相关功能,减少依赖。
·./configure --disable-openssl

(3)运行make命令用于编译源代码并生成示例可执行文件或库文件。

(4)运行sudo make install用于安装编译生成的库文件和头文件到系统的标准位置,以便其他程序可以在编译和链接时使用libevent.so库。

libevent源码解析
libevent是一个事件驱动的网络编程库,它提供了一种跨平台的方式来处理I/O事件和定时器事件。libevent事件驱动的核心是reactor模式。reactor模式将IO事件、定时器事件抽象成事件对象,并使用一个事件循环来监听这些事件对象。当有事件发生时,事件循环会调用相应的回调函数来处理这些事件。
(1)事件对象
·event_base_new() //构造对象
·event_base_free() //销毁对象
·event_new() //构建事件对象、绑定、事件回调
·event_free() //销毁事件对象
·bufferevent_socket_new() //构建bufferevent对象
·bufferevent_free() //销毁bufferevent对象
(2)事件操作
·event_add() //注册事件
·event_del() //注销事件
·bufferevent_enable() //注册事件
·bufferevent_disable() //注销事件
(3)事件循环
·event_base_dispatch() //启动事件循环,libevent会进入一个无限循环中,不断监听注册的I/O事件和定时器事件。当有事件发生时,libevent会调用相应的回调函数来处理这些事件。在事件处理完毕后,libevent会继续等待下一个事件的发生。
·event_base_loop() //启动事件循环,并一直等待事件的发生
·event_base_loopexit() //通知事件循环在指定时间后退出
·event_base_break() //通知事件循环在指定时间后立即退出
(4)事件处理
libevent使用事件驱动的编程模型来处理事件。在这种模型中,事件循环会不断监听注册的I/O事件和定时器事件。当有事件发生时,libevent会调用相应的回调函数来处理这些事件。当使用libevent注册一个事件时,libevent会将这个事件对象添加到事件循环中。当有事件发生时,libevent会调用相应的回调函数来处理这个事件。在回调函数中,可以执行相应的操作,例如读取数据、发送数据、关闭连接等。
·libevent通信流程:
1. 初始化:首先需要创建一个事件处理器(event_base),并初始化它。在初始化过程中,可以设置事件处理器的一些参数,比如事件处理模式、超时时间等。
2. 创建事件:在事件处理器中,需要创建需要监听的事件。通过调用event_new()函数来创建事件,并设置事件的回调函数和事件类型。
3. 添加事件:创建完事件之后,需要将事件添加到事件处理器中,通过调用event_add()函数来添加事件。添加事件之后,事件处理器就可以监听这些事件了。
4. 运行事件循环:在添加完事件之后,需要进入事件循环,等待事件的到来。通过调用event_base_dispatch()函数来运行事件循环,当有事件到来时,事件处理器会自动调用相应的回调函数进行处理。
5. 处理事件:当有事件到来时,事件处理器会自动调用相应的回调函数进行处理。在回调函数中,可以进行相应的操作,比如读写数据、关闭连接等。
6. 清理资源:当程序退出时,需要清理资源。通过调用event_base_free()函数来释放事件处理器占用的资源。
常用指令
| 指令 | 描述 |
|---|---|
| nc <host> <port>; | 创建TCP连接 |
| nc -u <host> <port> | 创建UDP连接 |
| nc -l <port> | 监听端口 |
| nc <host> <port> < file | 发送文件,nc 127.0.0.1 8080 < file.txt |
| nc -l <port> > file | 接收文件,nc -l 8080 > file.txt |
| nc -zv <host> <start-port>-<end-port> | 端口扫描,nc -zv 127.0.0.1 1-100 |
| netstat -tuln | 查看监听的TCP端口 |
| ss -tuln | 查看监听的TCP端口 |
| sudo iptables -L | 查看IPV4防火墙规则 |
| sudo ip6tables -L | 查看IPV6防火墙规则 |
问题记录
问题一:长连接的管理
通常情况下,客户端和服务器端会维护一个连接池,用来管理多个长连接。在连接池中,每个连接都可以用一个唯一的标识符(例如,连接编号、连接句柄、文件描述符等)来标记,但这个标识符不是由 TCP 协议自动分配的,而是由编程语言或操作系统提供的接口来生成。
问题二:连接关闭问题
1.任务结束的条件满足,其中一方(通常是服务器端)发送任务结束信号给对方(客户端)。
2.接收到任务结束信号的一方(客户端)根据协议判断任务结束,也可以在任务结束后发送任务结束确认信号给对方(服务器端)。
3.双方都知道任务结束后,可以分别在合适的时机主动关闭连接。
关闭连接的步骤是,主动关闭一方发送一个关闭连接的请求,等待对方确认。对方接收到关闭请求后,确认关闭并回复。然后双方都可以关闭自己的连接。这样可以保证双方都在知情的情况下安全地关闭连接。需要注意的是,在某些特殊情况下,如果连接的关闭是由客户端或服务器端中的某个程序意外终止或崩溃造成的,可能会导致连接未正确关闭。在这种情况下,可以使用心跳机制或超时机制来检测连接的状态,并在连接空闲一段时间后自动关闭连接,以防止连接资源泄漏。
问题三:客户端与服务器端存在多个TCP连接,数据发送是依次的还是并行的?
在客户端与服务器端存在多个TCP连接的情况下,数据发送可以是依次的,也可以是并行的,具体取决于实现的方式和程序设计。
(1)依次发送:如果客户端在处理数据发送时,使用一个连接发送完一个数据后再使用下一个连接发送下一个数据,这种情况下数据发送是依次进行的。客户端在处理多个连接时,每个连接发送数据的过程是按顺序进行的,即一个连接发送完后才会处理下一个连接发送。
(2)并行发送:如果客户端在处理数据发送时,同时利用多个连接进行数据发送,这种情况下数据发送是并行进行的。客户端可以在多个连接上同时发送数据,不需要等待一个连接的数据发送完毕再处理下一个连接的数据发送。
相关文章:
libevent源码学习笔记
libevent源码学习笔记 libevent安装libevent源码解析(1)事件对象(2)事件操作(3)事件循环(4)事件处理 常用指令问题记录问题一:长连接的管理问题二:连接关闭问…...
C++ opencv设置视频的捕获方式为 MJPG设置失败
我有一款4k摄像头,在设置分辨率为4k的时候总是出现帧率不够的情况, 使用命令查看 v4l2-ctl --device/dev/video0 --list-formats-ext发现 v4l2-ctl --device/dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMTType: Video Capture[0]: MJPG (Moti…...
计算机网络两位伟人
克劳德艾尔伍德香农 克劳德艾尔伍德香农(Claude Elwood Shannon)是一位美国数学家、电子工程师和计算机科学家,被誉为“信息论之父”。他于1916年生于密歇根州,于2001年去世。以下是一些关于他的详细介绍: 信息论的奠…...
机器学习 不均衡数据采样方法:imblearn 库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
MySQL系统与内建函数
在游戏开发、特别是像《三国志》这样的大型策略游戏中,数据分析是不可或缺的。从玩家行为到游戏内的战役结果,都需要通过高效的数据分析来优化游戏体验。MySQL的系统和内建函数为这样的分析提供了强大的工具。 本文将详细介绍MySQL中常用的系统与内建函数,并通过《三国志》…...
STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口)
STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口) 一、USB简介二、新建工程1. 打开 STM32CubeMX 软件,点击“新建工程”2. 选择 MCU 和封装3. 配置时钟4. 配置调试模式 三、USB3.1 参数配置3.3 配置时钟3.4 USB Device 四、生成代码五、查看端口…...
腾讯云 Cloud Studio 实战训练营结营活动获奖公示
点击链接了解详情 “腾讯云 Cloud Studio 实战训练营” 是由腾讯云联合 CSDN 推出的系列开发者技术实践活动,通过技术分享直播、动手实验项目、优秀代码评选、有奖征文活动等,让广大开发者沉浸式体验腾讯云开发者工具 Cloud Studio 的同时,实…...
使用晶体管做布尔逻辑和逻辑门
目录 二进制,三进制,五进制 true,false表示0,1 早期计算机采用进制 布尔逻辑 三个基本操作:NOT,AND,OR 基础“真值表” NOT 如何实现? AND如何实现? OR如何实现? 图标表示…...
Linux系统编程系列之线程的信号处理
一、为什么要有线程的信号处理 由于多线程程序中线程的执行状态是并发的,因此当一个进程收到一个信号时,那么究竟由进程中的哪条线程响应这个信号就是不确定的,只能取决于哪条线程刚好在信号达到的瞬间被调度,这种不确定性在程序逻…...
【C语言】青蛙跳台阶 —— 详解
一、问题描述 跳台阶_牛客题霸_牛客网 (nowcoder.com) LCR 127. 跳跃训练 - 力扣(LeetCode) 二、解题思路 1、当 n 1 时,一共只有一级台阶,那么显然青蛙这时就只有一种跳法 2、当 n 2 时,一共有两级台阶ÿ…...
Java - 基本数据类型和封装类型
基本类型有默认值,而包装类型初始为null。然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型。 Java语言提供了八种基本类型。六种数字类型(四个整数型ÿ…...
day-63 代码随想录算法训练营(19) 图论 part 02
1020.飞地的数量 分析:求不跟边界接壤的陆地的数量 思路一:深度优先遍历 先从四个侧边找陆地,然后进行深度优先遍历,把所有接壤的陆地(1)全部转换成海洋(0) 深度优先遍历…...
SpringBoot的全局异常拦截
在 Spring Boot 中,可以通过使用 ControllerAdvice 注解和 ExceptionHandler 注解来实现全局异常拦截。 RestControllerAdvice RestControllerAdvice 是 Spring Framework 提供的注解,用于定义全局异常处理类,并且结合 ExceptionHandler 注…...
『力扣每日一题11』:转换成小写字母
一、题目 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 示例 1: 输入:s "Hello" 输出:"hello"示例 2: 输入:s "here" 输…...
复习Day07:链表part03:21. 合并两个有序链表、2. 两数相加
之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131700482?spm1001.2014.3001.5501 我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Lab…...
Ubuntu中启动HDFS后没有NameNode解决办法
关闭进程: stop-dfs.sh 格式化: hadoop namenode -format 出现报错信息: 23/10/03 22:27:04 WARN fs.FileUtil: Failed to delete file or dir [/usr/data/hadoop/tmp/dfs/name/current/fsimage_0000000000000000000.md5]: it still exi…...
AWS-Lambda之导入自定义包-pip包
参考文档: https://repost.aws/zh-Hans/knowledge-center/lambda-import-module-error-python https://blog.csdn.net/fxtxz2/article/details/112035627 简单来说,以 " alibabacloud_dyvmsapi20170525 " 包为例 ## 创建临时目录 mkdir /tmp cd ./tmp …...
MAC 如何解决GitHub下载速度慢的问题
说在前面 解决github下载速度慢的方法很多,本文主要介绍通过Git镜像的方式解决下载慢的问题。 主要步骤有:1、找到gitconfig文件, 2、通过git命令查看当前生效的config 配置 3、使用git config命令编辑并添加国内镜像源 1、gitconfig 文件在…...
Redis与分布式-哨兵模式
接上文 Redis与分布式-主从复制 1.哨兵模式 启动一个哨兵,只需要修改配置文件即可, sentinel monitor lbwnb 1247.0.0.1 6001 1先将所有服务关闭,然后修改配置文件,redis Master,redis Slave,redis Slave…...
创建型设计模式 原型模式 建造者模式 创建者模式对比
创建型设计模式 单例 工厂模式 看这一篇就够了_软工菜鸡的博客-CSDN博客 4.3 原型模式 4.3.1 概述 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 4.3.2 结构 原型模式包含如下角色: 抽象原型类:规定了…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
