自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HTTPS协议原理

所以,对证书明文(数据)hash形成散列摘要,然后CA使⽤⾃⼰的私钥加密形成签名,将数据和加密的签名合起来形成CA证书,颁发给服务端,当客⼾端请求的时候,就发送给客⼾端,中间人截获了,因为没有CA私钥,就⽆法更改或者整体掉包,就能安全的证明,证书的合法性。第⼆组(⾮对称加密): ⽤于协商⽣成对称加密的密钥,客⼾端⽤收到的CA证书中的公钥(是可被信任的,来自服务端) ,给随机⽣成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密密钥。双⽅开始采⽤X进⾏对称加密,进⾏通信。

2025-03-02 18:21:20 503

原创 高级IO

在多线程或者多进程环境下,有人为了提高程序的稳定性,会让多个线程或者进程同时去监听一个socket文件描述符,但是当有新的连接请求进来的时候,操作系统不知道该选择哪个线程或者进程来处理,或者同时唤醒多个进程或者线程,但实际上只有一个进程或者线程能够处理该socket,这必然会导致资源消耗问题和性能的降低,这就是epoll的惊群效应。按照man手册的说法: 是为处理大批量句柄而作了改进的poll,它是在2.5.44内核中被引进的,它几乎具备了之前所说的一切优点,被公认为下性能最好的多路I/O就绪通知方法。

2025-03-02 10:57:59 989

原创 网络基础III

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

2025-02-27 15:47:48 838

原创 网络基础II

显然,PUT和POST用途是不一样的。虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据,但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题,因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵,在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的。最理想的情况下,找到一个最小的时间,保证 "确认应答一定能在这个时间内返回",但是这个时间的长短,随着网络环境的不同是有差异的,如果超时时间设的太长,会影响整体的重传效率,如果超时时间设的太短,有可能会频繁发送重复的包。

2025-02-26 23:22:23 896

原创 网络编程套接字

addrlen参数是一个传入传出参数(value-result argument),传入的是调用者提供的,缓冲区addr的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)建立连接后,TCP协议提供全双工的通信服务,所谓全双工的意思是,在同一条连接中,同一时刻,通信双方可以同时写数据,相对的概念叫做半双工,同一条连接在同一时刻,只能由一方来写数据。

2025-02-25 21:53:34 924

原创 网络基础I

通常也使用 "点分十进制" 的字符串表示IP地址,例如 192.168.0.1 ,用点分割的每一个数字表示一个MAC地址用来识别数据链路层中相连的节点字节,范围是 0 - 255;TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇,TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。在网卡出厂时就确定了,不能修改,mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突,有些网卡支持用户配置mac地址)

2025-02-24 17:19:17 678

原创 MySQL表的CURD

实际上不对数据进行操作,影响行数是0,所以比delete快,但是truncate在删除数据时,并不经过真正的事务,所以无法回滚。-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等。duplicate_table的去重数据插入到no_duplicate_table。-- 2 row affected: 表中有冲突数据,并且数据已经被更新。-- 1 row affected: 表中没有冲突数据,数据被插入。案例:删除表中的的重复复记录,重复的数据只能有一份。

2025-02-05 23:35:52 850

原创 MySQL表的约束

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键。

2025-01-11 23:25:23 1007 1

原创 MySQL库&表的操作

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型, 表的存储引擎等等。同事备份多个数据库:mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径;如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据 库,再使用source来还原。当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则。数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字。

2025-01-11 22:07:14 680

原创 Charles的常用功能

这个功能可用于测试接口的返回数据,但不会对页面展示产生影响。只需要在以往的网络请求上点击右键,选择 “compose”(或者选中网络请求再点击上方tab的“钢笔”)即可创建一个可编辑的网络请求。2.在 Charles 的菜单栏选择 “Proxy”–>“Recording Settings”,然后选择 Include 栏,选择添加一个项目,然后填入需要监控的协议,主机地址,端口号。选中需要修改的接口,选择map remote,编辑mapping信息(Query填“*”),设置映射的远程地址,点击“OK”

2025-01-09 21:36:38 918

原创 论坛系统项目测试实战

1.论坛系统项目是一个综合性很强的项目,涉及前端页面设计、后端业务逻辑实现以及数据库的高效管理。前端主要有六个个页面构成:登录页、注册页面、帖子列表页、帖子详情页、个人中心页面、以及帖子编辑页。其结合后端实现了以下的主要功能:登录、注册、编辑帖子、删除博客等功能。2.该论坛项目可以实现对个人信息、帖子标题、帖子发布时间、站内消息、个人中心等进行详细的查看,同时可以对帖子的类型进行分类,按需要进行帖子详情的查看。

2024-12-24 13:13:24 742

原创 基于多设计模式下的同步&异步日志系统

一、项目介绍1.1 项目功能本项目主要实现⼀个⽇志系统, 其主要⽀持以下功能:⽀持多级别⽇志消息⽀持同步⽇志和异步⽇志⽀持可靠写⼊⽇志到控制台、⽂件以及滚动⽂件中⽀持多线程程序并发写⽇志⽀持扩展不同的⽇志落地⽬标地1.2 开发环境vscode/vimg++/gdbmakefile1.3 核心技术类层次设计(继承和多态的应⽤)C++11(多线程、auto、智能指针、右值引⽤等)双缓冲区⽣产消费模型多线程设计模式(单例、⼯⼚、代理、建造者等)1.4 环境搭建。

2024-11-10 14:30:52 1218

原创 Linux文件系统&&软硬链接

记录的是整个分区的基本使用情况,主要有:每个块组的bolck 和 inode的总量, 未使用的block和inode的数量,每个块组一个block和inode的大小,每个块组的其实inode编号,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息,Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,磁盘的运动越少效率越高,运动越多效率越低,相关的数据一定要有意识的放在一起,所以为了区分存储内容的不同,以及快速定位寻址文件,就需要对磁盘进行分区。

2024-10-20 20:09:32 648

原创 Linux文件重定向&&文件缓冲区

printf fwrite 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。这里所说的缓冲区, 都是用户级缓冲区。其实为了提升整机性能,OS也会提供相关内核级缓冲区那这个用户级缓冲区谁提供呢?printf fwrite 是库函数, write 是系统调用,库函数在系统调用的“上层”, 是对系统 调用的“封装”,但是 write 没有缓冲区,而 printf fwrite 有,说明该缓冲区是二次加上的,由C标准库提供。

2024-10-03 23:03:26 1197 1

原创 Linux进程终止&&进程等待&&进程程序替换

返回值:当正常返回的时候waitpid返回收集到的子进程的进程id,如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0(非阻塞轮询),如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在。父进程不能直接拿到子进程的数据!,子进程在退出时,它的退出信息(退出码和接收到的信号)会被保存在该子进程的pcb数据结构对象内,如果父进程一直不对子进程的退出信息进行回收,该pcb数据结构对象就无法被释放,就会造成僵尸进程,进而引发内存泄露的问题。

2024-09-30 11:55:55 695

原创 Linux环境变量&&进程地址空间

地址总线排列组合形成的地址范围[0,2^32) 32根地址总线在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增 加,我们称之为进程调度O(1)算法。

2024-09-19 21:34:33 1225

原创 Linux进程状态&&进程优先级

每一个外设的pcb数据结构对象都会包含一个等待队列,当一个进程在获取某种外设资源时(比如scanf),外设资源还未准备好,该进程就会链入该外设的pcb等待队列进行等待,此时进程就处于阻塞状态,直到资源准备就绪,才会被链入运行队列等待CPU调度,将状态S改为R。问题是,我们在进行进程切换到时候,如果不把属于当前进程的存储在寄存器中的数据带走,那么下一个来的进程在把数据放入寄存器的时候就会将上一个进程的数据覆盖,等到该进程重新被CPU调度,就无法从上一次执行的位置继续往下执行。优先权高的进程有优先执行权利。

2024-09-16 11:48:43 1166

原创 Linux系统调用&&进程标识符

操作系统是一款做软硬件资源管理的“软件”

2024-09-13 16:20:13 954

原创 Linux编译器--gcc/g++使用

答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?要生成debug版本的可执行文件,可以在编译时添加-g选项。

2024-09-05 23:35:08 1054 1

原创 Linux权限理解

权限通俗上讲是指一件事情能否被允许做,权限可以由两部分组成:权限识别的是身份(身份与“人”相关),权限与事物的属性有关。那么在Linux下权限具体是指什么,由具体哪些部分来组成?目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目录, 即使目录仍然有-r 读权限而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限 ,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2024-09-04 20:53:18 614

原创 map和set的封装

map和set的底层都是用一棵红黑树来封装的,但是map和set节点里面存储的值不一样,map存储的是<key,pair<key,value>>,set存储的<key,key>,多存储一个key是因为查找节点的需要(查找节点一般是按照key去查找的),所以统一用data来表示map和set存储的数据,再在map和set内部定义一个仿函数,通过传参使用函数对象来获得data中具体的key值{}//set的keyoftreturn key;//map的keyofT二、红黑树的迭代器。

2024-09-02 23:36:17 1205

原创 红黑树的插入

RED,BLACK:_kv(kv),_col(RED){}红黑树的节点要默认给成红色,因为我们在插入一个新节点时该新节点必须为红节点。如果插入的是黑节点,那么该黑节点所在的路径上黑色节点的数量就会改变,但是红黑树必须保证每一跳路径上黑色节点的数量相同,插入黑节点会影响红黑树的所以路径。

2024-08-23 12:56:14 962

原创 AVL树的旋转

int _bf;

2024-08-23 11:29:26 811

原创 二叉搜索树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。

2024-08-16 11:17:05 888

原创 多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。多态的条件1.调用虚函数必须是基类的指针或者引用2.调用的函数必须是虚函数,并且派生类要对虚函数进行重写重载:必须在同一作用域,函数名相同,参数不同重写(覆盖):发生在基类和派生的作用域中,函数名、参数、返回值类型(协变例外)相同,必须为虚函数。

2024-08-16 10:32:50 889

原创 继承

访问限定符和继承方式是两个不同的概念,他们使用的关键字都一样,但他们在代码中定义的位置不一样。基类中的private成员无论以什么方式被继承都是不可见的。不可见就是说明基类的私有成员被继承到派生类中后,语法上限制在基类外和派生类里面都是不可访问的。如果希望一个成员变量在只能在基类和派生类中访问,那么在基类中可以使用protected来定义,可见保护成员的作用在继承中被真正体现了。

2024-08-11 23:33:25 989

原创 模板进阶

1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性。

2024-08-05 12:47:19 821

原创 反向迭代器

反向迭代器实质上就是用正向迭代器去封装实现的。反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++, 因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。

2024-08-05 11:33:32 243

原创 priority_queue--仿函数

可以使用仿函数当参数为指针时,想要比较指针所指向的内容,可以自定义一个适用于指针类型比较的仿函数。后续模板参数的特化也能解决这一问题。

2024-08-05 11:20:36 669

原创 list模拟实现--用节点封装的迭代器问题

/节点T _val;,_val(x){}节点类就相当于c语言中的BuyNewNode()

2024-08-01 11:15:56 814

原创 vector使用和模拟实现

1.成员变量vector的成员变量使用三个指针,通过三个指针的位置来控制vector的大小和容量2.vector的三种构造函数C++11支持在成员变量声明的位置给缺省值,因此vecto构造函数r的初始化列表可以不显示写这里有一个需要注意的细节,在用n个int类型的val去构造时要使用int n而不是size_t n。

2024-07-27 13:26:26 1075

原创 string使用和模拟实现

在构造时,将资源的计数给成1,每增加一个对象使用该 资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源, 如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;如果对象中管理资源,最后就会导致 多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该 资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。如果不自己显示写,那么编译器就会调用默认拷贝构造,进行逐个字节的浅拷贝。删除从pos位置开始的len个字符。

2024-07-26 12:15:59 828

原创 模板初阶

/stack 类public:_size = 0;_size++;i < _size;int _size;1.类模板不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误2.如果模版类里面的成员函数在类内声明,类外定义,在定义成员函数时要重新写一遍模板定义3.对于普通类,类名和类型是一样的;

2024-07-24 17:45:39 429

原创 C/C++动态内存管理

1.new的原理 :调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造2.delete的原理:在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间3.new T[]的原理:调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数4.delete[]的原理。

2024-07-15 12:21:42 651

原创 类和对象(下)

return dd1;return ptr;private:D(){}把类的构造函数限定为私有就可以避免在类外通过其他方式创建函数。限定为私有后,想在类外创建函数,就可以使用静态成员函数来实现,因为静态成员函数通过类域和访问限定符就可以访问到。

2024-07-15 11:29:33 769

原创 类和对象(中)---六个默认成员函数

1. 拷⻉构造函数是构造函数的⼀个重载2. 拷⻉构造函数的参数只有⼀个且必须是类类型对象的引用,使⽤传值方式编译器直接报错,因为语法逻辑上会。

2024-07-11 21:50:51 1084

原创 类和对象(上)

1.class为类的关键字+类的名字+{},{}为类的主体,类的定义结束后必须加分号。类的内容包括:类中变量称为类的属性或类的成员变量,类中函数称为类的方法或类的成员函数2.为了区分成员变量,会在成员变量前面加上特殊标符,如_或m,这个C++没有强制要求,具体看使用需求3.C++中struct也可以定义类,并且C++兼容struct的用法,同时将struct升级为类,最明显的变化是struct中可以定义成员函数4.定义在类中的成员函数某认为内联函数。

2024-07-10 10:47:02 734

原创 C++入门

一、C++关键字(C98)C++总计有63个关键字二、命名空间在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突,比如展开头文件的时候,标准库包含的关键字可能会与我们所定义的类型、变量、函数产生重名冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题。2.1命名空间的定义定义命名空间,需要使用关键字namespace,后面跟上命名空间的名字,然后接

2024-07-07 15:00:06 933

原创 二叉树的遍历(递归思想)

计算二叉树第k层的节点个数,由于我们无法直接找到第k层的位置,所以要采用相对位置的思想,即根节点所在的位置为第k层,递归访问左右子树,每访问一次k--,直到k=1,就找到了我们实际要的第k层,如果此时遇到的节点不为NULL就返回1,遇到NULL就返回0。二叉树的层序遍历采用队列的方式实现,根节点入队,出队时带入它的子节点入队(左孩子先入队,右孩子后入队),依次出队列。采用遍历的思想,遍历树的每一个节点,如果遍历过程中找到目标节点就返回节点指针,如果遍历结束后仍然没有找到目标节点就返回NULL。

2024-07-06 19:34:05 1657

原创 堆的调整和堆的TopK问题

如果有一个关键码的集合K,把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足,则称为小堆(或大堆)。将根节点最大的堆,且每个父节点都大于等于他的左右孩子叫做最大堆或大根堆,根节点最小的堆,且每个父节点都小于等于左右孩子叫做最小堆或小根堆。本文都以大堆为例。

2024-07-04 18:16:05 723

空空如也

空空如也

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

TA关注的人

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