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 结构 原型模式包含如下角色: 抽象原型类:规定了…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
