自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(106)
  • 资源 (1)
  • 收藏
  • 关注

原创 深入理解HTTP协议(三)

目录1. http 0.9 ~ http 2.0 的发展历程2. ssl 三次握手1. http 0.9 ~ http 2.0 的发展历程http 0.9:是最早的http版本,确定了http是基于TCP协议的,并且只能使用一个GET方法,在数据的传输格式中,只支持html格式的数据。http 1.0:可以传输图像、视频的格式,并且增加了许多新的请求方法,如Head、Put方法,但是一次只能接收一个TCP连接,并且当双方发送完数据之后,就断开这条TCP连接,换而言之就是只支持短连接。http1.

2021-10-09 15:46:45 286

原创 排序算法:选择排序和冒泡排序

目录1. 选择排序2. 冒泡排序1. 选择排序void SelectSort(vector<int>& iv){ int begin = 0; int end = iv.size() - 1; while (begin <= end) { int maxi = begin; int mini = end; for (int i = begin; i <= end; ++i) { if (iv[i] > iv[maxi])

2021-09-08 09:31:02 219

原创 排序算法:直接插入排序、归并排序(递归与非递归实现)

目录1. 直接插入排序2.归并排序2.1 递归2.2 非递归1. 直接插入排序void InsertSort(vector<int>& iv){ for (int i = 0; i < iv.size() - 1; ++i) { int end = i; int tmp = iv[end + 1]; while (end >= 0 && iv[end] > tmp) { iv[end + 1] = iv[end];

2021-09-07 17:09:07 494

原创 排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

目录1. 堆排2. 快排2.1 双指针法2.2 挖坑法2.3 前后指针法2.4 非递归2.5 快排的优化1. 堆排升序建大堆,逆序建小堆,先建堆,堆建好之后,将堆中最后一个元素和第一元素互换,然后执行向下调整算法进行调堆,最终实现相应的顺序。void AdjustDown(vector<int>& iv, int pos,int n){ int parent = pos; int child = pos * 2 + 1; while (child < n) {

2021-09-05 10:16:25 406

原创 项目——网络对战五子棋(Web-Gobang)

目录项目开发背景项目需求 & 开发环境项目设计 & 项目难点功能实现 & 难点解决1. 用户登录 / 注册2. 项目难点解决项目源码:https://github.com/mxzw/Project/tree/main/webgobang-project/src项目开发背景小时候,闲来无事最喜欢和别人玩的游戏之一就是五子棋了,它规则简单,但却玩法多变,直到现在我还时不时的在手机上和别人在线对战。最近自己学习Linux方面的相关知识,学习了多线程和Socket编程,并对网络这块

2021-08-15 17:13:04 2186 1

原创 五种高阶IO模型以及多路转接技术(select、poll和epoll)及其代码验证

目录1. 五种高阶IO模型1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 多路转接IO1.5 异步IO2. 多路转接技术(select、poll、epoll)2.1 select函数2.1.1 select 函数详解2.1.2 select函数优缺点2.2 poll函数2.3 epoll函数3. select、poll、epoll的代码验证3.1 select代码验证3.1.1 select 简单验证3.1.2 使用select函数解决TCP单进程下的单进程阻塞问题3.1.3 在多线程下调用s

2021-08-10 16:50:19 725 6

原创 多线程下的fork问题(模拟与解决)

目录前言1. 浅谈在多线程下的fork的问题2. 死锁问题的模拟实现3. 解决办法前言有关进程、多线程、fork的概念,请看我之前写的这两篇文章。Linux:进程控制(进程创建、进程终止、进程等待、进程程序替换)Linux:详解多线程(线程概念、线程控制—线程创建、线程终止、线程等待)(一)1. 浅谈在多线程下的fork的问题当fork函数创建出一个子进程的时候,子进程会拷贝父进程的进程虚拟地址空间,并且也会从父进程中拷贝一份相应的内存数据到子进程中,这是我们所知道的在单进程的情况下它是这样的,

2021-07-29 20:03:39 798

原创 单例设计模式(懒汉模式、饿汉模式)

目录1 设计一个类,只能在堆上开辟空间2 设计一个类,只能在栈上开辟空间2. 设计一个类,只能创建一个对象(单例模式)1 设计一个类,只能在堆上开辟空间在正常情况下,用类实例化出的对象,都会调动它的构造函数,构造函数会在栈上申请一份空间用来存储该对象的成员变量,但是现在规定该类只能在堆上开辟空间,对应的解决方案就是将该类的构造函数声明为私有的(private),为了能正常的获取到该类在堆上产生的对象,我们可以定义一个静态的方法,用来返回在堆上创建的对象。将该类的构造和拷贝构造函数声明为私有,防止别

2021-07-23 11:13:53 277 1

原创 文件海中一束光(文件快速搜索)

目录项目开发背景项目开发背景windows下文件夹框下的默认搜索是搜索时再进行暴力遍历查找,非常的慢,通常我们在windows下要查找一个文件需要花费大量的时间,尤其是当我们不知道具体的文件名时,只知道大概的、模糊的名称时,它的搜索速度会非常的慢。如下:而在Linux环境下则有非常好用的find命令就可以快速的对当前想搜索的文件进行定位。那么windows环境下能快速对文件进行检索吗?答案肯定是有的,也是我们大多数人都爱用的神器:everything,它是将文档信息检索以后,提前存储到

2021-07-22 21:56:35 896 3

原创 二叉搜索树(BST)的具体实现

目录1. BST树概念2. BST接口的实现2.1 寻找BST树中的结点(Search)1. BST树概念二叉搜索树又称二叉排序树,它或者是一颗空树,或者具有以下的性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。它的左右子树也分别为二叉搜索树。对一颗二叉搜索树进行中序遍历,就可以按照从小到大的顺序,将各节点关键码排列起来,所以被称为二叉排序树。BST的结构如下:template<typ

2021-07-10 20:23:19 425 1

原创 以太网协议、ARP协议、NAT协议、DNS协议

目录1. 数据链路层的以太网协议2. ARP协议1. 数据链路层的以太网协议数据链路层的以太网协议本质上其实就是相邻设备之间的数据转发。以太网协议格式:MAC地址:每一个网卡设备在出厂的时候都会拥有一个全球独一无二的MAC地址,MAC地址也被称为硬件的地址。本质上是:6字节的整数,即uint8_t addr[6]。可以在ifconfig(LINUX)中查看到对应的MAC地址。Windows中可以使用ipconfig -all进行查看以太网格式中的类型(2位):表示的是上层

2021-07-07 16:02:42 4285 11

原创 IP协议详解(IP协议格式、IP地址管理、路由转发)

目录1. IP协议格式1. IP协议格式

2021-07-07 10:02:46 2555 4

原创 TCP协议详解(图解TCP协议格式、TCP的各种可靠传输机制)(二)

目录1. TCP协议格式2. TCP的可靠传输机制2.1 确认应答(ACK)机制2.2 超时重传机制2.3 滑动窗口机制2.4 流量控制机制2.5 拥塞控制1. TCP协议格式如图:① 32位序号:该条TCP数据所携带的起始序号。② 32位确认序号:期望对方发送数据从哪一个序号开始发送。③ 4位首部长度:最大是0xF(15),指的是TCP头部的长度。首部长度 = 4位首部长度(DEC) * 4 ,单位为Byte。注:DEC:表示十进制的数字。④ 6个标志位:(6个比特位)U

2021-07-02 17:21:53 2130 2

原创 TCP协议详解(图解三次握手、四次挥手)(一)

目录1. 三次握手1. 三次握手TCP协议是面向连接、可靠传输、面向字节流的。那么TCP是如何保持可靠且有序的连接的呢?答案是三次握手+四次挥手。那么TCP的三次握手到底是如何进行的呢?如图所示:...

2021-07-02 10:46:58 1293

原创 UDP协议详解(UDP协议特点,UDP协议格式、UDP的应用)

目录前言1.UDP协议的特点2. UDP协议的特点3. UDP的应用前言TCP和UDP协议都是传输层的协议,其中传输层是负责端对端之间的连接,端是指端点。端口的划分和知名端口0~1023:知名端口3306:Mysql数据库1521:Oracle数据库22:ssh服务器21:ftp服务器23:telnet服务器80:http服务器443:https服务器可以使用cat /etc/services查看知名端口① 一个进程是否可以bind多个端口号?可以的,一个进程可以绑定

2021-06-30 18:57:47 9871 3

原创 深入理解HTTP协议(二)

目录1. HTTP请求方法1.1 GET:获取资源1.2 POST:传输实体主体1.3 PUT方法:传输文件1.4 HEAD:获得报文首部1.5 DELETE:删除文件1.6 OPTIONS:询问支持的方法1.7 HTTP请求方法的总结2. HTTP响应状态码及其解释2.1 状态码类别2.2 2XX:成功状态码2.2.1 200:OK2.2.2 204:NO Content2.2.3 206:Partial Content2.3 3XX:重定向状态码2.3.1 301:Moved Permanent

2021-06-27 12:38:11 294 1

原创 深入理解HTTP协议(一)

目录1. HTTP概述2. 对HTTP中URL的解释3. HTTP协议中的数据流4. HTTP协议的格式5. HTTP的协议版本6. HTTP请求方法6.1 GET:获取资源6.2 POST:传输实体主体6.3 PUT方法:传输文件6.4 HEAD:获得报文首部6.5 DELETE:删除文件6.6 OPTIONS:询问支持的方法6.7 HTTP请求方法的总结7. HTTP响应状态码及其解释1. HTTP概述HTTP:超文本传输协议HTTP协议是无连接、无状态。工作在应用层的协议。对无连接的

2021-06-27 12:37:42 449 2

原创 Linux:TCP粘包问题的模拟实现以及解决方法

目录1. TCP粘包问题的模拟实现1.1 何谓TCP粘包1.2 TCP粘包问题的模拟实现2. TCP粘包问题的解决办法1. TCP粘包问题的模拟实现1.1 何谓TCP粘包因为TCP协议是有连接,可靠有序,面向字节流的协议,也正是它面向字节流这个特性,导致存放在接收缓冲区的数据没有明显的界限,TCP的recv函数在接收数据的时候不会识别数据是第一条还是第二条,而是直接根据规定的大小进行读取数据,而我们每次都不知道发送数据方发送的数据大小,因此再读取数据的时候,极有可能读取到不完整的数据,或者说是粘连的

2021-06-26 14:41:29 673 3

原创 Linux:TCP Socket编程(代码实战)

目录1. TCP的Socket编程1.1 TCP的编程流程1.2 TCP Socket的接口1.2.1 服务端监听连接接口1.2.2 服务端获取新连接接口1.2.3 客户端发起连接接口1.2.4 发送数据接口1.2.5 接收数据接口2. 代码实战2.1 单进程版本的TCP代码1. TCP的Socket编程1.1 TCP的编程流程和UDP编程一样,我们在考虑TCP的时候也要考虑到接收方和发送方,也就是是说要考虑接收方和发送方的,但是由于TCP是有连接,可靠有序且面向字节流的传输层协议,因此,TCP的编

2021-06-26 12:54:43 2286 4

原创 Linux:UDP Socket编程(代码实战)

文章目录1. 网络字节序2. TCP、UDP的简单了解2.1 UDP协议2.2 TCP协议3. UDP的Socket编程3.1 编程的流程3.2 Socket的接口3.2.1 创建套接字1. 网络字节序① 首先我们需要知道什么是字节序?字节序就是CPU对内存数据的存取顺序② 其次,字节序中又分为大端字节序和小端字节序。大端字节序就是数据的低位保存在高地址,高位保存在低地址。小端字节序就是数据的低位保存在低地址,高位保存在高地址。举个例子来看一下,现在有一个数据0x12345678。 

2021-06-02 19:22:14 1486 5

原创 C++:多态(重写,多态原理、单继承和多继承的虚函数表)

目录1. 多态的相关概念和性质2. 虚函数重写时的两个例外1. 多态的相关概念和性质概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态的构成条件:① 父类函数必须为虚函数,并且在子类函数中必须重写该函数。② 必须要通过父类的指针或引用去调用虚函数。被virtual关键字所修饰的函数就是虚函数。所谓虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子

2021-05-30 20:28:58 758 6

原创 C++:继承(继承的概念和性质,赋值兼容规则,菱形继承和虚拟继承)

目录1. 继承的相关概念和性质2. 赋值兼容规则和同名隐藏3. 派生类的默认成员函数4. 菱形继承和菱形虚拟继承5. 组合和继承1. 继承的相关概念和性质概念:继承机制是面向对象程序设计使代码可以复用的最重要的手段****,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。性质:当子类继承父类是按照public继承的,则原来父类中的p

2021-05-30 16:45:00 390 9

原创 C++:STL——栈、队列和优先级队列的模拟实现

文章目录前言1.stack1.1 stack的介绍和使用1.2 stack的模拟实现2. queue2.1 queue的介绍与使用2.2 queue的模拟实现3. priority_queue3.1 priority_queue的介绍和使用前言在讲这些之前,我们需要了解一下双端队列:dequedeque:是一种双开口的"连续"空间的数据结构,其含义其实就是可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,插效率高,不需要搬移元素;与list比较,空间利用率比较高。deq

2021-05-26 15:53:30 402 2

原创 Linux:详解多线程(线程池、读写锁和CAS无锁编程)(四)

文章目录1. 线程池1.1 相关概念1.2 线程池的实现1. 线程池1.1 相关概念概念:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。线程池它本质上是包含了一个线程安全的队列和一大堆的线程线程池当中的线程都是从线程

2021-05-25 17:45:15 374 9

原创 Linux:网络基础(协议、数据的封装与分用)(一)

文章目录1. 协议1.1 协议的概念1.2 协议的分层1.2.1 OSI 七层模型1.2.2 TCP/IP四层(五层)模型2. 数据的封装与分用2.1 数据的流向2.2 ip,端口的本质和作用2.3 数据的封装和分用2.4 常见的问题1. 协议1.1 协议的概念协议的概念协议是双方约定同一种语言,从而可以进行沟通。网络协议那么网络协议就是通信双方在约定通信时使用的一种数据格式,从而进行网络通信。碎片知识:网络是按照区域进行划分的,可以划分为局域网、城域网和广域网。1.2 协议的分层

2021-05-24 15:31:59 227 4

原创 Linux:详解多线程(线程同步、信号量和生产者与消费者模型的实现)(三)

目录

2021-05-21 18:10:39 1170 11

原创 C++:Copy-On-Write技术以及string类的模拟实现

文章目录1.1.

2021-05-14 14:36:18 779 12

原创 Linux:详解多线程(线程安全、互斥和死锁)(二)

目录1. 线程安全(面试热点)1.1 线程安全的定义1.2 对正常变量进行操作的原理1.3 描述线程不安全的现象(重点)1.4 线程不安全的代码模拟2. 互斥2.1 互斥锁的原理2.2 互斥锁的接口2.2.1 初始化互斥锁变量1. 线程安全(面试热点)1.1 线程安全的定义在多个执行流访问同一临界资源的时候,不会导致程序结果产生二义性,即就是线程安全。在这里,我们首先需要知道以下几个名词的含义:执行流:这里的执行流可以理解为线程,即一个执行流就是一个线程的运行。访问:指的是对临界资源的

2021-05-13 10:54:56 763 9

原创 Linux:详解多线程(线程概念、线程控制—线程创建、线程终止、线程等待)(一)

目录1. 线程1.1 线程概念1.2 线程的共享与独有1.3 线程的优缺点1.3.1 线程的优点1.3.2 线程的缺点1.4 线程与进程的对比2. 线程控制2.1 创建线程1. 线程1.1 线程概念在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程(主线程)线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的

2021-05-08 21:59:54 1443 2

原创 C++:STL——vector的模拟实现

文章目录1. vector的介绍和使用2. vector的模拟实现2.1 vector构造函数和拷贝构造函数2.2 insert函数和eraser函数2.3 reserve函数和resize函数2.4 push_back函数和pop_back函数2.5 begin函数和end函数2.6 size函数、capacity函数2.7 empty函数和operator[]重载2.8 完整代码和相应测试1. vector的介绍和使用vector是表示可变大小数组的序列容器。就像数组一样,vector也采用

2021-05-05 20:57:37 335 4

原创 牛客网:连续子数组的最大和(动态递归解法)

目录题目描述题解题解代码题目描述连续子数组的最大和输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例1:输入:[1,-2,3,10,-4,7,2,-5]输出:18解释:输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和 18。题解分析题目可知,本题要求一个所有子数组和的最大值,因此我们考虑使用动态递归来进行求解。接下来我们

2021-05-04 22:04:24 480

原创 C++:STL——List的模拟实现

文章目录1. List的介绍和使用1.1 List的介绍1.2 List类一些接口的使用2. List的模拟实现1. List的介绍和使用1.1 List的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高

2021-05-04 17:15:09 275 4

原创 Linux:详解进程信号(信号的捕捉流程,信号的阻塞、volatile关键字)(二)

文章目录1. 信号的捕捉流程1.1 捕捉流程前言:阅读的时候如有不懂的的地方,可以看我之前写的详解进程信号(信号的种类、产生、注册、注销以及信号的各种处理方式)(一)1. 信号的捕捉流程在讲信号的捕捉流程的时候,我们需要首先明确的一个问题是:信号的注册,是否与操作系统所维护的进程PCB有关?在上一篇文章中也讲了,信号的注册实质是将tast_struct(PCB)结构体中的struct sigpending结构体变量,它所包含的sigset_t signal位图中所对应的那个信号的比特位置为1,然后

2021-05-02 15:31:22 1335 5

原创 Linux:详解进程信号(信号的种类、产生、注册、注销以及信号的各种处理方式)(一)(图文并茂)

目录1. 信号的概念2. 信号的种类3. 信号的产生3.1 硬件产生3.2 软件产生4. 信号的注册4.1 信号在内核中的存储表示4.2 非可靠信号的注册4.3 可靠信号的注册5. 信号的注销5.1 非可靠信号的注销1. 信号的概念信号是一个软件中断,相当于是一个口头的约束,对你的限制力比较低,举个例子来说就是当你买的快递到了需要你去取的时候,而你正在打游戏,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解成“在合适的时候去取。在这个过程中,你获得了一

2021-04-27 11:06:27 1162 9

原创 Linux:详解进程间通信——共享内存和消息队列相关接口及其代码验证(图文并茂)(二)

目录

2021-04-25 17:47:13 387 7

原创 Linux:详解进程间通信——管道(匿名管道和命名管道)(图文并茂)(一)

文章目录前言1. 匿名管道1.1 从命令去感受管道前言进程间通信的作用由于进程独立性的存在,两个过程想要直接交换数据是非常困难的,所以引入进程间通信来解决进程与进程之间交换数据的问题。目前,最大的进程间通信的方式是网络。进程间通信的方式:实现进程进程间通信的方式主要有三种:管道(匿名管道和命名管道)共享内存消息队列和信号量本节,我们就深入探讨一下管道是如何实现进程间通信的。1. 匿名管道在说匿名管道之前,我们有必要来提一下,什么是管道管道是Unix中最古老的进程间

2021-04-24 16:12:44 742 2

原创 C++:模板(函数模板和类模板)

文章目录1. 泛型编程2. 函数模板2.1 概念2.2 格式2.3 原理2.4 实例化2.4.1 隐式实例化2.4.2 显示实例化2.5 最佳匹配原则2.6 函数模板和模板函数3. 类模板3.1 格式3.2 实例化3.3 非类型模板参数3.4 零初始化3.5 typename和class3.5.1 只能使用typename的例子3.5.2 只能使用class的例子1. 泛型编程还记得我们经常使用的swap函数的实现吗?void swap(int& a,int& b){ int t

2021-04-22 17:29:01 923 2

原创 C++:动态内存管理 (new和delete)和常见的面试题

文章目录1. C/C++的内存分布2. C++的动态内存管理方式1. C/C++的内存分布之前也提到过,程序在内存中总共有五大区域,分别为:栈、堆、数据段、代码段和内核空间,但是实际上并不只有五大区域,还有一个区域位于栈和堆之间,叫做内存映射段,它可以用来存放用户自己创建的共享内存,实现进程间通信。但是对应在程序代码中,我们能够知道这些代码的对应这六大区域中的哪一个吗?举个例子:int globalVar = 1;static int staticGlobalVar = 1;void Tes

2021-04-22 11:11:41 333 1

原创 C++:运算符重载、static、友元函数和友元类、内部类

文章目录1. 运算符重载1.1 重载 +、-、*、/、% 运算符1.2 重载 +=、-= 运算符1.3 重载 前++、后++ 运算符1.4 重载 <、>=、>、<= 运算符1.5 重载 >> 、<< 运算符2. static成员3. 友元函数、友元类3.1 友元函数1. 运算符重载此处我们建立一个Test类来对其进行相应的运算符重载。class Test{public: explicit Test(int data ,char tmp = '0')

2021-04-20 14:33:04 598 1

原创 C++:类的6个默认成员函数以及深浅拷贝

文章目录1. 类的6个默认成员函数1. 类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。构造函数析构函数拷贝构造函数赋值重载函数取地址重载函数取地址重载函数常方法...

2021-04-19 22:20:48 418 2

cs-宾馆管理系统.zip

使用JDBC连接SQL数据库,并用GUI语法编写了管理系统的各种页面,实现了宾馆管理系统的诸多功能

2021-03-10

空空如也

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

TA关注的人

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