libevent源码学习笔记

news2025/1/11 15:11:00

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)并行发送:如果客户端在处理数据发送时,同时利用多个连接进行数据发送,这种情况下数据发送是并行进行的。客户端可以在多个连接上同时发送数据,不需要等待一个连接的数据发送完毕再处理下一个连接的数据发送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1058635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket实战之三遇上PAC

一、前言 前两天销售数据实时刷新功能开发测试完成&#xff0c;开开心心部署到生产环境&#xff0c;然后直接懵逼傻眼了&#xff0c;竟然连接不上WebSocket服务端&#xff0c;浏览器端请求头报 Provisional headers are shown 信息&#xff0c;然后采用一系列操作排查问题。 …

DS线性表之链表

前言 我们上一期介绍了顺序表&#xff0c;它的底层就是数组&#xff0c;我们也分别对顺序表的动态版本和静态版本进行了实现&#xff01;并且分析了顺序表的优缺点&#xff0c;优点是&#xff1a;尾插、尾删效率很高&#xff0c;其时间复杂度是O(1)&#xff1b;缺点是&#xff…

用于数据增强的十个Python库

数据增强是人工智能和机器学习领域的一项关键技术。它涉及到创建现有数据集的变体&#xff0c;提高模型性能和泛化。Python是一种流行的AI和ML语言&#xff0c;它提供了几个强大的数据增强库。在本文中&#xff0c;我们将介绍数据增强的十个Python库&#xff0c;并为每个库提供…

(二)激光线扫描-相机标定

1. 何为相机标定? 当相机拍摄照片时,我们看到的图像通常与我们实际看到的不完全相同。这是由相机镜头引起的,而且发生的频率比我们想象的要高。 这种图像的改变就是我们所说的畸变。一般来说,畸变是指直线在图像中出现弯曲或弯曲。 这种畸变我们可以通过相机标定来进行解…

轮询与中断

中断控制器 #include"exynos_4412.h"int main() {/*产生一个中断信号*//*1.属于外设层次&#xff0c;让外部的硬件控制器能产生一个中断信号并发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON GPX1.CON |( 0xF << 4);/*设置GPX1_1中断的触发方式---下降…

栈的应用场景(一)

逆波兰表达式 1.题目2.思路3.代码 1.题目 2.思路 3.代码 class Solution {public int evalRPN(String[] tokens) {//创建一个栈Stack<Integer> stack new Stack<>();//对字符串数组进行遍历for(String x : tokens){//分数操作符和操作数两种情况,我们得判断//一下…

JavaScript系列从入门到精通系列第十二篇:JavaScript中对象的简介和对象的基本操作以及JavaScript中的属性值和属性名

文章目录 前言 一&#xff1a;对象分类 1&#xff1a;内建对象 2&#xff1a;宿主对象 3&#xff1a;自建对象 二&#xff1a;对象的基本操作 1&#xff1a;创建对象 2&#xff1a;向对象中添加属性 3&#xff1a;读取对象中的属性 4&#xff1a;修改对象中的属性 三…

使用晶体管做布尔逻辑和逻辑门

目录 二进制&#xff0c;三进制&#xff0c;五进制 true&#xff0c;false表示0&#xff0c;1 早期计算机采用进制 布尔逻辑 三个基本操作&#xff1a;NOT,AND,OR 基础“真值表” NOT 如何实现&#xff1f; AND如何实现&#xff1f; OR如何实现&#xff1f; 图标表示…

算法——买卖股票问题

309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 一、 究其就是个动态规划的问题 算法实现图 初始化 由于有三个阶段&#xff0c;买入&#xff0c;可交易&#xff0c;冷冻期&#xff0c;那么用dp表表示现在为止的最大利润&#xff0c;则有 dp[0][…

基于Redis实现消息队列的实践

为什么要基于Redis实现消费队列&#xff1f; 消息队列是一种典型的发布/订阅模式&#xff0c;是专门为异步化应用和分布式系统设计的&#xff0c;具有高性能、稳定性及可伸缩性的特点&#xff0c;是开发分布式系统和应用系统必备的技术之一。目前&#xff0c;针对不同的业务场…

WebSocket实战之四WSS配置

一、前言 上一篇文章WebSocket实战之三遇上PAC &#xff0c;碰到的问题只能上安全的WebSocket&#xff08;WSS&#xff09;才能解决&#xff0c;配置证书还是挺麻烦的&#xff0c;主要是每年都需要重新更新证书&#xff0c;我配置过的证书最长有效期也只有两年&#xff0c;搞不…

由于计算机中丢失msvcp110.dll的解决方法与msvcp110.dll丢失修复方法

相信大家在打开电脑软件或许游戏都有遇到过电脑提示找不到msvcp110.dll文件&#xff0c;导致软件游戏打不开&#xff0c;我们应该怎么办&#xff1f;不用着急&#xff0c;今天小编我分享我找了很久成功解决问题的方法给大家&#xff0c;希望可以帮到各位。 1. 使用DLL修复工具&…

python——Django框架

一、基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身基于 MVC …

简单的考试系统

开发一个简单的考试系统&#xff0c;在HTML页面中建立一个表单&#xff0c;通过post方法传递参数。题目类型包括单选题、多选题和填空题&#xff0c;要求程序给出考试成绩。 <!DOCTYPE html> <html> <head><title>question.html</title><met…

SpringBoot banner 样式 自动生成

目录 SpringBoot banner 样式 自动生成 图案网站&#xff1a; 1.第一步创建banner.txt文件 2.访问网站Ascii艺术字实现个性化Spring Boot启动banner图案&#xff0c;轻松修改更换banner.txt文件内容&#xff0c;收集了丰富的banner艺术字和图&#xff0c;并且支持中文banner下…

【C语言】文件操作(三)

前言 在文件操作&#xff08;二&#xff09;中我们学习了顺序读写文件的函数&#xff0c;在这篇博客中我们将学习⽂件的随机读写&#xff0c;⽂件读取结束的判定。 文章目录 一、文件的随机读写1.1 fseek1.2 ftell1.3 rewind 二、文件读取结束的判定2.1 ferror和feof 三、文件缓…

键盘上F1至F12键的作用

多年来&#xff0c;我们习惯了最上排的12个按键&#xff0c;从F1到F12&#xff0c;它们被称为“快速功能键”&#xff0c;可以让你更轻松地操作电脑&#xff1b;但是&#xff0c;很多人可能从未使用过它们&#xff0c;也从来不知道它们的用途。那么今天&#xff0c;就向大家科普…

【Pytorch笔记】4.梯度计算

深度之眼官方账号 - 01-04-mp4-计算图与动态图机制 前置知识&#xff1a;计算图 可以参考我的笔记&#xff1a; 【学习笔记】计算机视觉与深度学习(2.全连接神经网络) 计算图 以这棵计算图为例。这个计算图中&#xff0c;叶子节点为x和w。 import torchw torch.tensor([1.]…

web漏洞-PHP反序列化

目录 PHP反序列化序列化反序列化原理涉及技术利用危害CTF靶场 PHP反序列化 序列化 将对象转换成字符串 反序列化 相反&#xff0c;将字符串转换成对象。 数据格式的转换对象的序列化有利于对象的保存和传输&#xff0c;也可以让多个文件共享对象。 原理 未对用户输入的序列化字…

使用关键字interface来声明使用接口-PHP8知识详解

继承特性简化了对象、类的创建&#xff0c;增加了代码的可重用性。但是php8只支持单继承&#xff0c;如果想实现多继承&#xff0c;就需要使用接口。PHP8可以实现多个接口。 接口类通过关键字interface来声明&#xff0c;接口中不能声明变量&#xff0c;只能使用关键字const声明…