自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 收藏
  • 关注

原创 MySQL基础 [一] - 数据库基础

一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据内容管理能力(用户角度)也就是说数据的提取分析过程,是需要程序员去自己解决的,文件提供的就只是基本的读写能力,未来对内容的增删改查都需要程序员去自己查看,这是非常麻烦的事情 数据库的本质:对数据内存存储的一套解决方案,你给我字段或者要求(mysql客户端下发的),我(mysqld)直接给您结果!

2025-04-05 16:12:42 272

原创 MySQL基础 [一] - Ubuntu版本安装

可以使用 systemctl [stop| start| restart| status] mysql, 命令对MySQL服务进行[停止| 启动|重启|查看服务状态]操作。这里下载的仍然是最新的版本 --- mysql-apt-config_0.8.33-1_all.deb。发布包的命名格式:mysql-apt-config_w.x.y-z_all.deb。我们发现可以正常使用 MySQL指令了,就说明安装完成了。出现这样的界面, 表示我们成功设置完成!没有出现报错信息, 表示设置成功!

2025-04-05 10:31:34 577

原创 Muduo网络库实现 [十三] - HttpRequest模块

首先我们要先知道HTTP的请求的流程是什么样子的,不然我们会学的很迷糊。对于HTTP请求如何到来以及去往哪里,我们应该很清楚的知道。它本质上是HTTP请求信息的容器,使服务器能够方便地访问和处理客户端的请求内容。再HttpRequest的头部字段中,有一个很重要的信息就是。最后就是正文部分,正文部分是交给上层业务逻辑去处理的,我们。比如对请求行的解析,我们会使用正则表达式来进行,同时,对于参数和请求头部,我们可以提供结构,用来。首先请求行中,有请求方法,url ,协议版本,,长短连接后续我们会用到。

2025-04-04 23:59:03 676 3

原创 Muduo网络库实现 [十五] - HttpContext模块

记录每一次请求处理的进度,便于下一次处理。上下文模块是模块中最重要的一个模块,他需要记录每一次请求处理的进度,需要保存一个HttpRequest对象,后续关于这个连接的http的处理的信息全部都是在这个上下文中保存。那既然是记录,肯定就要让它知道当前是在哪个进度了,所以我们就用状态码去表示通常,而不是已经完成的状态。

2025-04-04 22:05:16 1009 1

原创 Muduo网络库实现 [九] - EventLoopThread模块

也就是我们的_thread_id还没有切换到我们想要的线程id上,还在创建EventLoop的线程中,那么这时候操作就是由这个创建EventLoop的线程执行了,而后续切换线程之后,又会由新的线程来执行操作,那么就会出现一个连接的所有操作并不在一个线程中全部完成,可能会出现在多个线程中执行的情况,同时,在设置我们的指针成员的同时,有可能由其他的线程需要获取这个指针,那么就会出现读写并发的情况,或者说这个指针变量会有线程安全问题。然后就是构造函数,无非就是初始化_loop和设置thread的入口函数。

2025-04-03 20:00:16 1074 14

原创 Muduo网络库实现 [十] - EventLoopThreadPool模块

在多Reactor模式中,通常有一个主Reactor(MainReactor)负责接受连接,然后有多个从属Reactor(SubReactor)负责处理已建立连接的I/O事件。EventLoopThreadPool就是管理这些SubReactor线程的线程池。

2025-04-03 18:17:33 1067 12

原创 Muduo网络库实现 [七] - Connection模块

具体执行的操作就是这样的,但是 Upgrade 这个接口有点特殊,它是线程不安全的,所以必须在EventLoop线程中执行,同时,这还不够,他必须被立马执行,不能放到任务队列中,因为如果如果放到任务队列中,那么如果此时有读事件到来,那么就会先进行事件处理,也就是会先使用老的处理函数进行处理,然后才更新回调方法,这是不对的,我们必须在调用Upgrade的时候立即将协议的回调函数和上下文进行替换。然后就是任意事件回调,任意事件回调我们只需要判断是否启动了超时连接,如果启动了,那么就需要刷新定时任务。

2025-04-03 13:51:08 1155 12

原创 Muduo网络库实现 [八] - Acceptor模块

Acceptor模块是专门用于接收获取新连接,该模块挂载在主Reactor线程上。也就是创建一个监听套接字。为监听套接字设置读回调函数。当监听套接字读事件到来时,需要自动调用读事件回调,为新连接创建Connection对象并添加管理,同时Acceptor还需要和一个EventLoop绑定。那么Acceptor中需要,我们需要提供TcpServre的接口来进行,TcpServer模块会对服务器的所有模块进行统一管理。

2025-04-02 16:48:13 898

原创 Muduo网络库实现 [五] - Poller模块

因为未来我们在添加某个事件的监控时,有可能该文件描述符在之前我们并没有添加到 epoll 模型中,这时候我们使用的是 EPOLL_CTL_ADD 操作,而其他的时候,对监控的事件进行修改,则是EPOLL_CTL_MOD操作,仅仅是对epoll模型中的红黑树节点中的内容进行修改,并不对节点的删除与插入做管理。是要传给Channel中的回调函数处理的。那么这个对象中要实现事件的监控,就必须要保存一个epoll操作句柄(就是钥匙,没有这个钥匙,启动不了对应的epoll),也就是一个_epfd。

2025-04-01 14:54:23 809 5

原创 Muduo网络库实现 [四] - Channel模块

具体来说每一个套接字都会对应一个 Channel 对象,用于对它的事件进行管理。可以对于描述符的监控事件在用户态更容易维护,以及触发事件后的操作流程更加的清晰Channel模块是用于对一个描述符所需要监控的事件以及事件触发之后要执行的回调函数进行管理的

2025-03-31 22:18:44 866 5

原创 Muduo网络库实现 [三] - Socket模块

Socket模块主要是对套接字的基础操作进行封装,简化我们对套接字的操作,不需要调用C的原生接口,而是以面向对象的方式来调用。 那么我们需要封装哪些接口呢?首先,最基础的接口,创建套接字,绑定地址信息,建立连接,开始监听,获取新连接,读取数据,写入数据,关闭套接字这几个基本功能我们还是需要提供的。其次就是两个特殊的功能: 设置套接字非阻塞,因为后续我们读取和写入都是非阻塞进行的。 还有就是设置地址信息和端口号复用,这是为了便于服务器崩溃之后能够立即以固定端口重启。还需要提供两个集成的功能,创建一

2025-03-31 18:05:17 1031 2

原创 Muduo网络库实现 [二] - Buffer模块

Buffer模块是用于通信套接字的缓冲区,用于用户态的输入输出的数据缓存。为什么要有用户态的输入缓冲区?TCP协议是字节流的,我们无法保证一次收到的数据就刚好是一个完整的报文。 但是我们从TCP的输出缓冲区提取出来之后,在TCP的内核缓冲区中就已经将读取出来的数据无效了,那么我们就势必需要一个用户态的缓冲区用于应对这种情况。那么为什么需要用户态输出缓冲区呢? 因为如果我们直接向套接字的输出缓冲区写入的话,有可能写条件并不具备,那么这时候我们就会阻塞在写入或者说写入失败,这两种情况要么就是降低了效率,

2025-03-30 23:28:53 908 4

原创 C/C++ 基础 - 回调函数

函数指针也是个指针,但是和通常的指针不一样通常的指针指向的是整型、字符型或数组等变量而函数指针,指向的是函数回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。这段话比较长,也比较绕口。下面我通过一幅图来说明什么是回调:假设我们要使用一个排序函数来对数组进行排序,那么在。

2025-03-30 17:15:25 1252 42

原创 LINUX基础 [十] - 线程池和单例模式

代码构建类,类实例化出对象,这个实例化出的对象也可以称为实例,比如常见的STL容器,在使用时,都是先根据库中的类,形成一个实例以供使用;正常情况下,一个类可以实例化出很多很多个对象,但对于某些场景来说,是不适合创建出多个对象的比如本文中提到的线程池,当程序运行后,仅需一个线程池对象来进行高效任务计算,因为多个线程池对象无疑会大大增加调度成本,因此需要对线程池类进行特殊设计,使其只能创建一个对象,换句话说就是不能让别人再创建对象正如一山不容二虎一样,线程池对象在一个程序中是不推荐出现多个的。

2025-03-29 23:29:16 611 1

原创 C++基础 [十七] - 哈希表

哈希(Hash)是一个广泛的概念,其中包括哈希表、哈希冲突、哈希函数等,核心为 元素(键值) 与 存储位置(哈希值) 之间的映射关系,哈希值 可以通过各种哈希函数进行计算,需要尽量确保 “唯一性”,避免冲突,除此之外,哈希函数还可用于 区块链 中,计算 区块头(Head)中的信息,本文将带你认识哈希,学习其中的各种知识

2025-03-28 22:50:13 1435 40

原创 算法 - 回文排列

回文排列 这道题,可以说是--回文专题 和 哈希专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!题目描述题目链接:面试题 01.04. 回文排列 - 力扣(LeetCode)预备知识什么回文串?回文串的概念就是正着读和倒着读是一样的字符串,分为以下两种情况① 11211 ---- 奇数个② 112211---- 偶数个不难发现,除了中间的字符外所有的字符均在一首一尾出现了一次,也就是说,

2025-03-27 20:00:38 339 3

原创 LINUX基础 [三] - 进程创建

创建新进程在Linux的下是由父进程来完成的,创建完成的新进程是子进程。新进程的地址空间有两种可能性:子进程是父进程的复制品(除了PID和task_struct是子进程自己的,其余的都从父进程复制而来)子进程装入另一个程序。在Linux下的fork函数用于创建一个新的进程,使用fork函数来创建一个进程时,子进程只是完全复制父进程的资源。这样得到的子进程和父进程是独立的,具有良好的并发性。但是进程间通信需要专门的机制。

2025-03-25 19:32:22 920 22

原创 LINUX基础IO [七] - 文件缓冲区的深入理解

举个例子,比方说你和你的好朋友相隔千里,而你想要给他送个键盘,如果没有快递公司和菜鸟驿站(缓冲区)的话,那么你可能得坐车好几天才能到他那里,但如果你的楼下有菜鸟驿站和快递公司,那么你只需要下楼付点钱填个单子就行了,接着你可以去忙你自己的事情,当旁边的人问你键盘去哪里的时候,你会说已经寄给朋友了,其实这个时候你的键盘可能还在快递公司放着。——>所以方案是根据不同的需求来的!内核缓冲区也是由操作系统的file结构体维护的一段空间,和语言的缓冲区模式是类似的,作为用户我们不需要太关心操作系统什么时候会刷新。

2025-03-24 08:31:50 771 12

原创 LINUX基础IO [六] - 文件理解与操作

文件操作是 基础IO 学习的第一步,我们在 C语言 进阶中,就已经学习了文件相关操作,比如 fopen 和 fclose,语言层面只要会用就行,但对于系统学习者来说,还要清楚这些函数是如何与硬件进行交互的

2025-03-23 22:02:54 1232 34

原创 LINUX基础 [二] - 进程概念

在学习了【Linux系统编程】中的​ 操作系统和冯·诺依曼体系结构之后,我们已经对系统应该有了不错的了解,接下里我们将继续深入的了解操作系统最重要的的功能之一:进程操作系统能不能一次运行多个程序呢?答案是当然可以的!!因为运行的程序有很多,所以 OS 需要将这些运行的程序管理起来。我们将这些正在运行的程序称之为进程。(注意:是正在运行的程序叫进程,而不是程序本身)程序的一个执行实例,正在执行的程序等担当分配系统资源(CPU时间,内存)的实体对于课本中的观点大家可能会觉得难以理解,

2025-03-22 22:03:35 6998 41

原创 C++基础 [十二] - 继承与派生

在编程中,继承是面向对象编程(OOP)的核心概念之一。它通过让一个类(子类)继承另一个类(父类)的特性和行为,帮助我们实现代码复用、提高程序的扩展性和灵活性。那么,为什么继承在编程中如此重要呢?什么是继承假设有个App需要去获取不同类型用户的数据,并进行分类,那么就需要我们去写对应不同的类,比如说学生老师军人公司职工…………每个类都需要有名字、联系方式、家庭住址、年龄……,我们会发现这样每个类都要写一份,非常冗余,于是我们的祖师爷为了解决这个问题,设计出了继承的语法,

2025-03-21 19:25:21 1301 21

原创 C++基础 [九] - Stack和Queue的使用与模拟实现

队列【queue】是一种特殊的数结构,同时也是一种容器适配器,遵循先进先出FIFO原则,其中从容器一端插入元素,另一端提取元素。主要操作:入队、出队、判断队空、查看队头队尾元素等;队列在原则上 是不允许进行 中部的操作,这样会破坏队列的完整性。从下图,可以看到队列【queue】也是作为容器适配器被实现,容器适配器是对特定类封装作为其底层容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层。元素从队尾入列,从队头出列。

2025-03-20 09:27:12 582 15

原创 C++基础 [八] - list的使用与模拟实现

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2025-03-19 23:01:33 1167 3

原创 C++基础 [七] - Vector的模拟实现

本模块呢,我将会带大家一起从0~1去模拟实现一个STL库中的 vector类,当然模拟实现的都是一些常用的接口,以便于让大家更好的巩固之前学习过的 缺省参数、封装、类中的6大默认成员函数等

2025-03-18 23:51:39 614 47

原创 C++基础 [五] - String的模拟实现

本模块呢,我将会带大家一起从0~1去模拟实现一个STL库中的 string类,当然模拟实现的都是一些常用的接口,以便于让大家更好的巩固之前学习过的缺省参数、封装、类中的6大默认成员函数等string类的模拟实现。

2025-03-17 23:38:58 1250 23

原创 C++基础 Vector的使用

跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,

2025-03-16 23:18:37 396 8

原创 C++基础 [三] - 面向对象三

内部类是在一个类的成员部分定义的另一个类。内部类是⼀个独立的类。跟定义在 全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。计算外部类对象的大小就不会将内部类的成员包括在内。

2025-03-15 23:15:58 739 4

原创 IO多路转接 ——— select、poll、epoll

上面的情况是普遍的,也有特殊情况,LT不必将所有的fd设置成非阻塞然后循环读取,比如只要LT第一次通知的时候就把数据全取走,就和ET一样了,所以ET和LT谁效率高?这些就绪的文件描述符会被添加到内核的。poll也是操作系统提供的一个多路转接接口,poll可以让我们的程序同时监视多个文件描述符上的事件是否就绪,和select的定位是一样的,poll是为了解决select的几个缺点。总结一下,就是poll需要“遍历”,当监视的套接字很多时,效率会下降,所以poll的缺点不再是功能上的了,而是效率上的了。

2025-03-13 21:16:02 871 6

原创 LINUX网络基础 [十一] - 其他重要协议或技术

域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如www.baidu.com。com:一级域名,表示这是一个工商企业域名。同级的还有.net(网络提供商)和.org(开源组织或非盈利组织)等。baidu:二级域名,一般对应的就是公司名。www:只是一种习惯用法,之前人们在使用域名时,往往命名成类似ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。

2025-03-12 21:43:49 762 3

原创 LINUX网络基础 [十] - 以太网协议

需要注意的是,缓存表中的表项有过期时间,这个时间一般为20分钟(为了防止某些主机更换网卡,IP地址没变,但是Mac地址变了),如果20分钟内没有再次使用某个表项,那么该表项就会失效,下次使用时就需要重新发起ARP请求来获得目的主机的硬件地址。其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际数据链路层还有两种协议叫做ARP和RARP。到了火焰山之后呢,牛魔王问他:和尚你从哪里来,要到那里去?

2025-03-12 17:43:42 897 2

原创 LINUX网络基础 [九] - IP协议

我数学成绩很好,10次考试6次满分,然后大家都在传,说我有“数学考满分的能力”,那么我一定能做到吗?不一定,只是有很大的概率考满分如果我想每次都考满分,该怎么办呢?我有很大的概率考满分,但是我不想要这个概率。我只想每次都考满分。好在我不光成绩好,我叔、三叔是教导主任。我是个特别执拗的人,考不到满分我就会发脾气,我三叔很宠我。如果本次考试没有考满分,我三叔就会让这次考试无效,重新考。这样就能保证每次都考满分。其中,三叔是我的上层,而我是真正用来考试执行的人。

2025-03-11 23:14:53 844 2

原创 LINUX网络基础 [八] - TCP协议

主动断开连接的一方,在4次挥手完成之后,要进入time_wait状态,等待若干时长之后,自动释放连接断开后,会维持一段时间的TIME_WAIT状态,在此期间, 不能重新在同样的端口启动服务,因为连接没有被彻底断开,ip和port正在被使用。

2025-03-10 23:32:42 1229 5

原创 LINUX网络基础 [六] - UDP协议

比如说服务器启动了Http的客户端,可以接受到来自客户端请求,对于客户端A和客户端B,客户端的端口号可能是一样的,但是他们的IP地址是不一样的,所以服务器构建响应时返回时,可以根据IP地址来区分不同的主机了。我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首 部). 然而64K在当今的互联网环境下, 是一个非常小的数字.当发送一个超过64K的报文,也能使用UDP,但是要发送那么大的数据就必须要自己在应用层,把报文拆成64*X的大小。

2025-03-09 18:42:16 1027 51

原创 LINUX网络基础 [五] - HTTP协议

应用层常见的协议有HTTP和HTTPS,传输层常见的协议有TCP,网络层常见的协议是IP,数据链路层对应就是MAC帧了。其中下三层是由操作系统或者驱动帮我们完成的,它们主要负责的是通信细节。如果应用层不考虑下三层,在应用层自己的心目当中,它就可以认为自己是在和对方的应用层在直接进行数据交互。

2025-03-08 22:48:46 6046 32

原创 LINUX网络基础 [四] 自定义协议+序列反序列化

大家明显感觉到序列化和反序列化都是字符串处理,而且还比较麻烦,如果手写比较丑陋,有没有现成的方法使用呢?答案是有的。市面上常见的解决方案是:json,protobuf都可以帮助我们自动序列,反序列化json的安装使用json前需要按照第三方库,才能进行使用使用apt来安装在 Ubuntu 系统中,应该使用apt包管理器来安装软件包。你可以尝试使用以下命令来安装jsoncpp确认jsoncpp安装后,你可以检查是否已经成功安装了jsoncpp查看json的头文件和库文件json测试用例。

2025-03-07 15:31:34 15080 33

原创 一文让你真正理解 守护进程!!!

定义: 守护进程(Daemon Process)是指在后台运行的进程,它通常不与用户直接交互,而是为系统或其他程序提供服务。守护进程一般会在系统启动时启动,运行在后台,处理各种系统任务或服务请求,直到系统关闭。特点后台运行:守护进程通常不需要用户干预。它们在后台静默运行,进行必要的任务处理,比如文件清理、定时任务、网络服务等。不依赖终端:守护进程通常脱离终端,意味着它不会与任何终端相关联,不会占用用户的终端窗口。它们的标准输入、标准输出、标准错误都可能被重定向。无用户交互。

2025-03-06 15:01:31 500 11

原创 LINUX网络基础 [三] - TCP和守护进程

来一个,创一个,会造成子进程越来越多。注意: 当任务队列当中有任务时,线程池当中的线程会先定义出一个Task对象,然后将这个Task对象作为输出型参数调用任务队列的Pop函数,从任务队列当中获取任务,因此Task类除了提供带参的构造函数以外,还需要提供一个无参的构造函数,方便我们可以定义无参对象。此时当客户端连接服务器后,服务端的主线程就会获取该客户端的连接请求,并将其封装为一个任务对象后塞入任务队列,此时线程池中的5个线程就会有一个线程从任务队列当中获取到该任务,并执行该任务的处理函数为客户端提供服务。

2025-03-05 23:10:16 745 10

原创 只需八步,完全搞定UDP的实现,看过的都说好!!

服务器端接收到消息后,判断消息类型为chat,跳转到chat函数下,向除了该用户以外的所有用户发送消息,使所有用户都能够看到该用户发送的消息,从而实现群聊天的功能。在login登录状态下,用户只需要输入用户名,然后将信息发送到服务器端,服务器判断消息类型为login,跳转到login函数下,向所有用户发送该用户登录成功的消息,并将该用户信息存储到链表中。服务器接收到消息,判断消息类型,跳转到quit函数中,向所有用户发送该用户退出聊天室的消息,同时从链表中找到该用户信息并将其从链表中删除。

2025-03-04 23:33:02 644 2

原创 LINUX网络基础 [二] - 网络编程套接字,UDP与TCP

在计算机网络中,端口号和 IP 地址是用于网络通信的基本元素,它们在实现网络应用和服务时发挥着至关重要的作用。通过理解 TCP 和 UDP 协议,网络字节序,socket 接口以及端口和 IP 地址的工作方式,我们能够深入掌握网络通信的原理和实现。通过本篇文章的学习,您将能够对端口号、TCP 和 UDP 协议、socket 编程等概念有更深入的理解,为后续的网络编程打下坚实的基础。TCP适用于那些对数据可靠性和顺序有较高要求的场合,虽然它在传输速度上较慢,但能够确保数据完整无误。UDP。

2025-03-03 23:32:48 1177 3

原创 LINUX网络基础 [一] - 初识网络,理解网络协议

计算机网络在现代社会中发挥着举足轻重的作用。它打破了数据的孤立状态,使得不同计算机之间能够高效地交换信息和共享资源。无论是工作、学习还是生活,计算机网络都已经成为人们不可或缺的一部分。它让人们能够随时随地访问互联网,获取各种信息和服务,极大地提高了工作效率和生活质量协议(Protocol)是一种约定,是指一组用于规定计算机之间进行通信时,如何传输数据和处理信息的规则和约定。协议是网络通信的基础,它定义了数据传输、错误检测、数据压缩、数据加密等多个方面的细节,以确保不同设备能够顺利、高效地进行通信。

2025-03-02 23:56:23 1424 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除