- 博客(42)
- 收藏
- 关注
原创 【项目-轻量级Web Server http连接处理类】
writev的返回值为已写的字节数,但这个返回值“实用性”并不高,因为参数传入的是iovec数组,计量单位是iovcnt,而不是字节数,我们仍然需要通过遍历iovec来计算新的基址,另外写入数据的“结束点”可能位于一个iovec的中间某个位置,因此需要调整临界iovec的io_base和io_len。从状态机负责读取buffer中的数据,将每行数据末尾的“\r”、“\n”符号改为“\0”,并更新从状态机在buffer中读取的位置m_checked_idx,以此来驱动主状态机解析。
2024-07-20 00:15:00
1113
原创 【项目-轻量级Web Server 定时器模块】
项目中将连接资源、定时事件和超时时间封装为定时类连接资源包括客户端套接字地址、文件描述符和定时器定时事件为回调函数,将其封装起来由用户自定义,这里是删除非活动socket上的注册事件,并关闭定时器超时时间 = 浏览器和服务器连接时刻 + 固定时间(TIMESLOT),这里定时器使用绝对时间作为超时值//连接资源结构体成员需要用到定时器类,需要前向声明struct client_data { //开辟用户socket结构 对应于最大处理fd//客户端socket地址int sockfd;
2024-07-19 16:30:00
890
原创 【项目-轻量级Web Server 数据库连接池】
池可以看做资源的容器,所以多种实现方法,比如数组、链表、队列等。这里,使用单例模式和链表创建数据库连接池,实现对数据库连接资源的复用。
2024-07-18 13:23:23
937
原创 【项目-轻量级Web Server 日志系统(下)】
日志文件局部变量的懒汉模式获取实例生成日志文件,并判断同步和异步写入方式同步判断是否分文件直接格式化输出内容,将信息写入日志文件异步判断是否分文件格式化输出内容,将内容写入阻塞队列,创建一个写线程,从阻塞队列取出内容写入日志文件通过局部变量的懒汉单例模式创建日志实例,对其进行初始化生成日志文件后,格式化输出内容,并根据不同的写入方式,完成对应逻辑,写入日志文件。日志类包括但不限于如下方法,公有的实例获取方法初始化日志文件方法异步日志写入方法,内部调用私有异步方法。
2024-07-17 08:15:00
693
原创 【项目-轻量级Web Server 日志系统(上)】
本项目中,使用单例模式创建日志系统,对服务器运行状态、错误信息和访问数据进行记录,该系统可以实现按天分类,超行分类功能,可以根据实际情况分别使用同步和异步写入两种方式。其中异步写入方式,将生产者-消费者模型封装为阻塞队列,创建一个写线程,工作线程将要写的内容push进队列,写线程从队列中取出内容,写入日志文件。日志系统大致可以分成两部分,其一是单例模式与阻塞队列的定义,其二是日志类的定义与使用。本节将介绍单例模式与阻塞队列的定义,具体的涉及到单例模式、生产者-消费者模型,阻塞队列的代码实现。
2024-07-16 16:10:51
591
原创 【项目-轻量级Web Server lock类】
互斥量不是为了消除竞争,实际上,资源还是共享的,线程间也还是竞争的,只不过通过这种“锁”机制就将共享资源的访问变成互斥操作,也就是说一个线程操作这个资源时,其它线程无法操作它,从而消除与时间有关的错误。P 操作会使得信号量的值减 1,如果此时信号量的值小于 0,则调用进程或线程会被阻塞,等待其他进程或线程对信号量进行 V 操作,使得信号量的值大于 0,此时阻塞的进程或线程才能继续执行。V 操作会使得信号量的值加 1,如果此时信号量的值小于等于 0,则会唤醒阻塞在该信号量上的某个进程或线程。
2024-07-15 15:45:00
1096
原创 【Windows socket编程示例,服务端传输文件客户端收文件】
socket起源于Unix,Unix/Linux的特点是把文件作为不分任何记录的字符流进行存取,文件、文件目录和设备具有相同的语法语义和相同的保护机制,即“一切皆文件”,因此可以把socket看成是一种特殊的文件,socket函数则是对这种文件进行的操作(读写I/O、开启、关闭)若未发生错误,则recv()函数返回收到的字节数,buf指向的缓冲区将包含接收到的数据,如果连接正常关闭,则返回值为0,否则返回SOCKET_ERROR值,可以通过调用WSAGetLastError来检索特定的错误代码。
2024-07-12 17:09:19
793
原创 【CMake的入门使用】
CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。
2024-07-11 11:04:29
554
原创 C++中,与类型转换相关的四个关键字
用于执行静态类型转换,通常用于较为安全的类型转换,如基本数据类型之间的转换,以及具有继承关系的指针或引用类型之间的转换。它在编译时进行类型检查,因此具有较高的类型安全性。但是,对于不相关的指针类型的转换,:用于执行动态类型转换,主要用于具有继承关系的类之间的转换。对于指针类型之间的转换没有任何类型检查,因此非常不安全,应谨慎使用。:用于执行低级别的类型转换,通常用于不同类型之间的指针类型转换,或者将指针转换为整数类型。只能用于具有虚函数的类,或者用于指向多态基类的指针或引用。属性,从而进行常量转换。
2024-04-11 15:38:45
335
原创 C++ 中的类和结构体
C++ 中的类(Class)和结构体(Struct)是两种用户定义的数据类型,它们可以包含数据和函数来表示现实世界中的对象和行为。这两种类型的主要区别在于它们的成员访问权限以及继承时的默认访问权限。
2024-01-15 16:24:36
543
原创 Swap分区
swap分区的作用,物理内存(RAM)是有限的,当系统的RAM使用接近或达到极限时,为了不让系统崩溃,操作系统可以使用部分硬盘空间作为虚拟内存,以便转移部分低优先级的内存页或不活跃的进程信息。
2023-12-20 14:34:03
472
原创 ubuntu20.04 x86_64架构环境上使用QEMU搭建aarch64虚拟机
cpu model # 设定CPU模型,如cortex-a57、cortex-a9等。-bios file #设置bios启动文件-nographic #禁用图形界面支持。-m megs # 设定虚拟机的RAM大小,单位MB。-smp n # 设定模拟的SMP架构中CPU的个数。根据自己的需求自行安装;(配置名字,设置账号密码等)-M machine # 指定要模拟的主机类型。
2023-08-24 08:48:32
1420
原创 Ubuntu20.04 安装opencv4
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的函数和工具,用于处理图像和视频数据,以及实现计算机视觉算法。OpenCV支持多种编程语言,如C ++,Python和Java,并提供了跨平台的支持,包括Windows、Linux、Mac以及移动平台等。
2023-08-08 14:16:13
1822
原创 ”E: 无法对目录 /var/lib/apt/lists/ 加锁“怎么解决
这个错误通常是由于另一个进程正在使用APT包管理器而导致的。通常情况下,这种情况会在后台的软件包管理器或其他包管理工具运行时发生。
2023-08-07 14:58:09
726
原创 C语言-柔性数组
通过柔性数组,我们可以方便地根据需要存储不同长度的数据,只需在分配内存时动态指定数组长度即可,使得数据结构更加灵活和高效。需要注意的是,在使用完毕后,必须使用free函数释放动态分配的内存空间,以防止内存泄漏。在上述示例中,MyStruct结构体中定义了一个柔性数组data[],它表示可变长度的数据。柔性数组(Flexible Array)是C语言中的一种特性,它允许数组的最后一个成员的大小为0或未知,在定义数组时不给出具体长度,而在运行时动态分配所需的内存空间。
2023-07-26 15:05:52
122
原创 CppUTest的安装
CppUTest 是一个基于 C/C++ 的单元 xUnit 测试框架,用于单元测试和测试驱动代码。它是用C++编写的,但在C和C++项目中使用,并经常用于嵌入式系统,但它适用于任何C / C++项目。设计简单,使用简单。可移植到新旧平台。为测试驱动开发人员使用测试驱动开发进行构建。
2023-06-29 17:24:38
542
原创 Boost安装和创建线程的使用
Boost是一个流行的C++库集合,它包含了大量的用于C++程序开发的工具和组件,能够使C++程序员更快地开发高质量的代码。Boost库的目标是在不增加复杂性的情况下,提供对C++语言现有功能的增强,并且对标准C++库进行补充。Boost库中的组件包括但不限于:智能指针、容器、多线程、正则表达式、数值算法、文件系统操作、日期和时间处理等。这些组件都被广泛应用于诸如高性能计算、网络编程、图像处理和数据分析等多个领域中。
2023-06-25 18:11:24
2834
1
原创 基于哈夫曼树的文件压缩和解压
哈夫曼树(Huffman Tree)是一种带权路径长度最短的树,也称最优二叉树,是经典的数据压缩算法中的核心思想。哈夫曼树的构建过程:根据给定的n个权值 {w1, w2, …, wn},构造n棵只有一个节点的二叉树(这些节点我们可以视为叶子节点),每棵二叉树的根节点的权值已经设定为对应权值。在森林里选取两棵根节点的权值最小的树进行合并。得到一棵新树,该树的根节点权值为原来的两棵树的根节点权值之和。将新树放回森林中,并将原来两棵树从森林列表中删除。重复执行步骤2和3,直到森林里只有一棵树为止。
2023-06-18 19:15:44
3326
1
原创 数据结构-数组基础
vector 内部是通过一个动态分配的数组来存储元素,在使用 push_back() 函数向 vector 容器中添加元素时,vector 会根据当前容器中的元素数量和当前容器的容量进行计算,如果当前容器能够容纳这些新元素,则将新元素插入到连续存储空间的末尾,如果容量不足,则需要重新分配内存空间以容纳这些新元素,并将其存储到新内存中。值得注意的是,虽然 vector 容器在实际使用时大小可以动态扩展,但在定义容器时需要指定其初始大小,或者使用无参构造函数定义一个空的容器,这将在实际使用时动态调整其大小。
2023-06-09 16:41:51
101
原创 关于操作系统的一些问题
异步:在多批道处理系统中,由于并发进行的进程中,存在调度的随机性和执行速度的独立性,即间接制约,导致各个进程走走停停 同步:多个进程之间存在直接制约关系,而为了提高执行速度,让各个进程之间互相发送消息,确定执行顺序,而不会出现走走停停的情况,达到同步。同步不是指多个进程同时执行,而是指多个进程之间互相发送消息,不会出现走走停停的混乱情况,将无序变为有序。中断是系统运行期间发生任何紧急事件,使得CPU暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序。
2023-06-02 14:36:02
383
原创 C++矩阵计算-杂记(包含Eigen库的安装)
它提供了广泛的功能,包括矩阵操作(例如逆矩阵、特征值分解、奇异值分解)、向量操作(例如内积、外积)、线性方程组求解和特殊矩阵操作(例如对称矩阵求解、三角矩阵求解)。打开Visual Studio项目,右键点击项目名称,选择“属性”,在属性管理器中点击“新建属性表”按钮,输入一个名称作为属性表的名称,并点击“添加”按钮。C++中的重载运算符 (operator overloading) 是指在类中重新定义运算符,使其可以处理用户自定义的类型,实现与内置类型相同的功能。来指定Eigen库的位置,并使用。
2023-05-13 15:02:04
2096
1
原创 Ubuntu20.04 安装ROS Noetic
在Ubuntu 20.04中安装ROS(Robot Operating System)有两个主要版本可供选择:ROS Noetic和ROS Melodic。ROS(Robot Operating System)是一款用于构建机器人软件的开源框架。ROS还提供了各种软件包和工具来进行机器人感知、规划、控制、仿真和测试等方面的开发。以下是安装ROS Noetic步骤~
2023-05-09 08:53:46
1133
原创 Makefile模板
(TARGET):目标依赖于所有目标文件即 $(OBJS),当所有目标文件都存在时通过编译器将它们组合在一起生成最终可执行文件 $(TARGET)。$(OBJS):生成目标文件的规则即将每个源文件 $(SRCS)单独编译为一个目标文件 $(OBJS)。它不是编译程序或链接程序,而是在已经编译出中间代码的目标文件之间进行转换,以建立起最终程序。%.o : %.c:定义了将.c文件转换为.o文件的规则。$<:表示当前规则的依赖文件,即当前要编译的.c文件。TARGET:目标文件名。OBJS:目标文件名列表。
2023-05-08 18:13:48
347
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人