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 结构 原型模式包含如下角色: 抽象原型类:规定了…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...