- 博客(193)
- 资源 (3)
- 收藏
- 关注
原创 网络层IP协议
所谓的IP分片就是在网络层将有效载荷进行切分,而切分的依据就是数据链路层的MTU(Maximum Transmission Unit),在Linux中,这个值一般是1500字节。发送方的网络层需要根据MTU进行分片,那么对应的接收方就需要对分片的数据进行组装但是如果出现分片,那么就会增加丢包的概率,假如,一个包丢包的概率为0.01,那么对应的接收方正常收到数据的概率就是0.99,如果需要分片为10个数据,此时丢包的概率就变成了1−0.99101−0.9910。
2025-04-05 10:47:51
247
原创 Boost库搜索引擎项目(版本1)
/ 结果基本内容结构// 结构标题// 结果内容或描述// 网址读取到源文件目录下所有的HTML文件,将其拼接为一个字符串存储到vector中根据上一步得到的vector中的数据,取出每一个文件中的三个字段:文档标题、文档内容和文档在Boost官网的URL都存放到一个结构化对象中,再将该对象存储到一个vector中根据上一步结果的vector中每一个结构化数据读取并写入到一个文本文档raw,每一个结构化数据以一个\n分隔,而其中的成员以\3分隔- 根路径- data。
2025-04-05 09:18:44
709
原创 C++17中的string_view库
C++17引入的是一个轻量级的、非拥有型(non-owning)的字符串引用类型,它提供了一个只读视图,指向已经存在的字符序列(如字符数组、等)。定义在头文件中,属于std命名空间。
2025-04-02 16:08:08
332
原创 Boost库中的谓词函数
int age;{"张三", 25, "北京"},{"李四", 30, "上海"},{"王五", 22, "北京"},{"赵六", 35, "广州"},{"钱七", 28, "上海"}// 创建复杂谓词:北京的年轻人(25岁以下)或上海的年长者(30岁以上)(arg1.city == "北京" && arg1.age < 25) ||(arg1.city == "上海" && arg1.age > 30);// 应用过滤// 显示结果。
2025-04-01 22:11:40
1004
原创 C++17 filesystem库
C++17引入的filesystem库提供了跨平台的文件系统操作功能,使开发者能够以统一的方式处理路径、文件和目录操作,而不必担心不同操作系统间的差异。这个库最初源自,现已成为C++标准的一部分定义在头文件,定义在命名空间定义在头文件,定义在命名空间。
2025-03-29 15:14:29
888
原创 TCP协议原理
前面已经基本介绍了TCP编程的接口以及基本的步骤,但是并没有其中的原理进行解释。本篇主要聚焦于TCP原理部分,对TCP中重要的内容进行解释。
2025-03-23 17:27:06
675
原创 HTTPS协议介绍与原理
数字指纹(数据摘要),其基本原理是利用单向散列函数(哈希函数)对信息进行运算,生成一串固定长度的数字摘要数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。一旦数据被篡改,新的数字指纹就有很大的不同数据指纹常见算法:有MD5、SHA1、SHA256、SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据对比。
2025-03-23 17:20:12
559
原创 Linux与HTTP中的Cookie和Session
前面几篇已经基本介绍了HTTP协议的大部分内容,但是前面提到了一点「HTTP是无连接、无状态的协议」,那么到底有什么无连接以及什么是无状态。基于这两个问题,随后解释什么是Cookie和Session,以及二者是如何通过代码实现的HTTP最大的特点就是无连接和无状态所谓的无连接指的是HTTP请求服务器时不需要HTTP协议自己与服务器建立连接,由于HTTP是基于TCP的,所以整个连接工作交给了TCP,这一点在前面实现时也有所体现所谓的无状态指的是HTTP本身不会保存任何用户信息,举个例子,如果当前网站需要用户登
2025-03-20 22:12:19
1043
原创 Linux与HTTP报头属性和请求方式
在上面以及之前两节中,服务器都是向客户端直接响应字符串或者一个静态资源,但是有的时候不只有静态资源,还有很多的动态资源,例如在表单提交时form标签内的action字段的值就是对应的一个动态资源以一个实例表单为例:</在这个表单中,action。
2025-03-18 17:15:45
950
原创 Linux与深入HTTP序列化和反序列化
在上一节已经完成了客户端和服务端基本的HTTP通信,但是前面的传递并没有完全体现出HTTP的序列化和反序列化,为了更好得理解其工作流程,在本节会以更加具体的方式分析到HTTP序列化和反序列化本节会在介绍HTTP协议基本结构与基本实现HTTPServer的基础之上继续完善HTTP服务器,所以需要有对应的知识作为铺垫才可以开始本节。
2025-03-15 22:11:17
1084
原创 介绍HTTP协议基本结构与Linux中基本实现HTTPServer
前面已经了解了协议的重要性并且已经定义了属于我们自己的协议,但是在网络中,已经有一些成熟的协议,最常用的就是HTTP协议在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如HTML文档)HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是一个基于TCP协议的。
2025-03-15 22:04:35
1532
原创 Linux中的序列化和反序列化与网络计算器
在前面UDP编程和TCP编程中,客户端和服务端之间传递的信息都是字符串,那么是否可以传递一个结构化的数据,例如前面聊天室中,传递一个类似于下面结构化的数据:实际上,如果是同一台计算机下,直接传递是完全可以的,因为同一台计算机对一个数据的封装和还原都是使用的同一个方式,但是在网络中,网络可能涉及到不同的操作系统,不同的计算机,其中就可能涉及到对结构化数据的设定,例如结构体的内存对齐问题,所以在网络中不建议之间传递结构化的数据,尽管在某些情况下可以既然不能使用结构化数据,但是又可以使用字符串形式的数据,那么有
2025-03-07 16:14:54
1125
原创 Linux与UDP应用2:简易聊天室
在前面的基本使用过程中已经完成了本地和网络通信,既然一个人和一台服务器可以进行通信,那么多个人连接一台服务器也可以和这台服务器实现通信。在这个基础上,如果服务器可以将某个人发给服务器的消息转发给所有连接到当前服务器的客户端,就可以实现一个人发消息,其他人看到消息的效果,这就是简易聊天室的原理本篇就是利用UDP的操作实现上面提到的简易聊天室,其中客户端向服务端发送消息,服务端将收到的消息转发给所有连接到当前服务器的客户端需要注意,本次实现基于前面封装的服务端和客户端。
2025-03-01 20:47:45
795
原创 Linux中的UDP编程接口基本使用
在前面网络基础部分已经介绍了网络的基本工作模式,有了这些理论基础之后,下面先从UDP编程开始从操作部分深入网络4. 整体代码优化:对常见属性进行封装,优化封装的服务端和客户端根据上面的内容,本次设计的服务器功能就是接受客户端发送的信息并向客户端返回服务端收到的信息。
2025-02-26 21:40:23
904
原创 网络基础知识
在计算机发展历程中,经历过下面四个阶段:独立模式:计算机之间相互独立,每台计算机做自己的事情,彼此之间没有直接信息传递。如果两台计算机需要通信就需要将当前计算机的数据通过某种方式拷贝到另一台计算,如下图所示:网络互联:多台计算机连接在一起,完成数据共享。示意图如下:局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起广域网WAN:将远隔千里的计算机都连在一起所谓「局域网」和「广域网」只是一个相对的概念之所以会逐渐发展为大范围的网络可以理解为主要原因是计算机是人的工具,人要协同工作。
2025-02-24 10:09:06
1359
原创 Linux线程安全与死锁
线程安全:就是多个线程在访问共享资源时,能够正确地执行,不会相互干扰或破坏彼此的执行结果。一般而言,多个线程并发同一段只有局部变量的代码时,不会出现不同的结果。但是对全局变量或者静态变量进行操作,并且没有锁保护的情况下,容易出现该问题重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数=== “常见的线程不安全的情况”
2025-02-22 14:29:59
537
原创 Linux与读者写者问题、读写锁、自旋锁
自旋锁是一种多线程同步机制,用于保护共享资源免受并发访问的影响。在多个线程尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。这种机制减少了线程切换的开销,适用于短时间内锁的竞争情况。但是不合理的使用,可能会造成CPU的浪费。
2025-02-22 14:27:56
639
原创 Linux线程池
线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络套接字等的数量,示意图如下:本次线程池的设计考虑设计固定数量的线程池。
2025-02-20 22:37:18
1249
原创 Linux日志系统
计算机中的日志是记录系统和软件运行中发生事件的文件,主要作用是监控运行状态、记录异常信息,帮助快速定位问题并支持程序员进行问题修复。它是系统维护、故障排查和安全管理的重要工具日志实际上也有一些现成的解决方案,例如spdlog、glog、Boost.Log、Log4cXx等等。
2025-02-19 20:56:56
1454
原创 生产者消费者模型(Producer-Consumer Model)
生产消费模型就是通过一个容器来解决生产者和消费者的强耦合问题。具体来说就是生产者和消费者彼此之间不直接通讯,而通过阻塞队列(即交易场所)来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔进阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的在本次实现中,首先考虑实现只有一个生产者和只有一个消费者的模式(单生产者单消费者),再进一步扩展到多生产者和多消费者的模式。
2025-02-18 10:16:28
1156
原创 Linux线程与信号量
因为在进程部分,让两个进程看到同一个资源比较麻烦,所以对应的接口也比较麻烦。创建信号量结构对象并初始化对应的计数器,使用sem_init接口进行初始化在操作资源之前先申请信号量,如果资源不足时进行等待,使用sem_wait接口进行在离开资源时增加信号量,使用sem_post接口进行不再使用信号量时销毁信号量结构对象,使用接口进行。
2025-02-18 10:10:36
779
原创 Linux线程互斥与同步
创建互斥锁,使用类型创建互斥锁变量初始化互斥锁,使用初始化互斥锁变量或者使用接口进行初始化进入临界区之前加锁,使用接口出临界区进行解锁,使用接口销毁互斥锁,使用接口对于创建互斥锁的两种方式:如果使用直接初始化互斥锁变量,那么就不需要使用对互斥锁变量进行初始化以及不需要使用对互斥锁进行销毁注意,不可以通过初始化赋值的形式初始化互斥锁变量创建条件变量,使用类型创建条件变量初始化条件变量,使用值或者使用接口进行初始化条件不成立时等待,使用接口使指定线程等待条件成立时唤醒,使用。
2025-02-17 11:31:43
784
原创 Linux线程库与线程库封装
id在线程操作部分提到了使用接口获取到当前线程的id这个结果实际上就是一个地址值,所以所谓的线程id实际上就是一个地址值而并不是LWP值,具体原因在接下来介绍线程库时即可解释。
2025-02-17 11:28:32
1006
原创 Linux线程概念与线程操作
前面提到进程=程序代码和数据+进程结构体,在线程部分就需要进一步更新之前的认识进程实际上承担分配系统资源的基本实体,而线程是进程中的一个执行分支,是操作系统调度的基本单位此处需要注意,操作系统并不是直接调用进程,而是调用线程,所以进程并不是操作系统调度的基本单位。
2025-02-14 18:54:31
1161
原创 Linux进程信号
在前面的进程状态与进程优先级部分提到,如果想要终止一个进程可以使用ctrl+c,其本质就是进程收到一个终止的信号所谓信号,就是一种用户、操作系统或者其他进程向目标进程发送异步事件的一种方式,而其中的异步事件表示不会立即处理的事件,因为进程收到信号之前一直在执行其代码,收到信号的那一刻之前进程并不知道自己会收到信号,当进程收到信号时,就需要做出对应的操作,此时进程可能并不是立即去完成对应的操作知道了何为信号,接下来就需要了解产生信号的方式。
2025-02-14 18:47:37
909
原创 Linux消息队列与信号量
遵循System V标准的进程通信除了共享内存外还有消息队列,消息队列从其字面意思就是传递消息的一个队列。实际上,其作用与队列也是非常像的,但是它并不是语言的中间件消息队列与共享内存不同的是,消息队列可以同时让两个进程既可以从消息队列中读取数据,也可以向消息队列中写入数据,只不过进程读取数据时读取到的是另外一个进程写入的数据,而不是自己本身的数据,所以为了对消息队列中的数据作区分,除了数据本身外,还需要一个数据标识区分是哪一个进程写入的对应数据,示意图如下:ipcs -q。
2025-02-13 17:45:40
807
原创 Linux命名管道与共享内存
除了前面提到的两个管道可以进行进程通信外,共享内存也是一种方式,但是共享内存是System V标准下的进程间通信方式。共享内存本质就是在内存上开辟一块空间并将其链接到两个进程的PCB中,从而让两个进程都能看到同一块资源,进而实现进程间通信,具体原理如下图所示:在上面的原理图中,将共享内存通过页表链接到进程PCB的过程叫做挂接,当进程PCB与共享内存断开连接的过程叫做去关联。
2025-02-12 22:49:07
1035
原创 Linux进程间通信
在介绍匿名管道前,先了解何为管道:管道是Unix/Linux中最古老的进程间通信的形式,把从一个进程连接到另一个进程的一个数据流称为一个「管道」。在前面Linux常用选项和指令已经介绍过管道的基础使用,此处进一步探讨管道到底是如何执行的这个指令的作用是:统计当前使用Linux系统有多少个用户登录。其中,who显示当前登录的用户和其他信息,wc用于代表word count,可以用来统计给定文件中的字节数、字数、行数等,其中的-l表示只输出行数上面的命令执行过程如下:当在命令末尾加上。
2025-02-12 22:44:52
679
原创 Linux软链接和硬链接
为了接下来可以更好得理解某些概念,首先提出何为ELFELF(Executable and Linkable Format,可执行链接格式)是一种常见的文件格式,用于二进制文件,包括可执行文件、目标代码、共享库以及核心转储ELF头(ELF header):描述文件的主要特性。其位于文件的开始位置,它的主要目的是定位文件的其他部分程序头表(Program header table):列举了所有有效的段(segments)和他们的属性。
2025-02-11 17:01:08
1289
1
原创 Linux文件系统
文件系统是操作系统用来管理和组织存储设备上的数据的一种方式。它定义了如何将数据结构化地存储在磁盘或其他介质上,以及如何管理这些数据的访问和维护。前面提到操作系统可以对磁盘上的整个空间进行分区。分区后,每一个区可以有不同的文件系统,不同的分区彼此相互独立下面的讨论主要以ext2文件系统为例操作系统为了保证每一个磁盘文件都有迹可循,在文件系统中存在一个inode结构,一般大小为128字节,这个结构主要保存文件的属性信息,而对应的文件会在其结构中存在一个成员可以访问其inode信息下面是inode。
2025-02-11 16:11:20
616
原创 Linux中输入和输出基本过程
在上面的演示中,先关闭了某一个文件描述符较前的文件,再打开另一个文件,打开的这个文件所处的位置是就是被关闭的那个文件的位置,此时再使用输出语句输出内容,原本应该输出到文件描述符较前的原始文件中,比如前面的。但是,前面的代码中,只演示了关闭0号位置和2号位置的文件,如果此时关闭1号位置的文件,再打开同样的四个文件,输出每一个文件的文件描述符,从前面的规律可以推出,输出语句会因为1号位置的文件是。函数以外,其他的C语言库函数均出现两次打印的情况,本质就是因为语言级缓冲区自动刷新到系统内核级缓冲区机制,而因为。
2024-10-22 10:48:24
1243
原创 Linux文件操作基础
根据冯诺依曼体系结构,除了内存、CPU以外,其他设备均称为外设,也称为输入输出设备,而这些设备在接入计算机时,需要在计算机中安装驱动,而安装驱动的本质就是为了将对应的硬件信息加载到属于硬件的信息表中,而操作系统为了管理这些表,就需要创建一个结构体,这一个过程符合「先描述,再组织」的「描述」,此处的每一个结构体都是通过双向链表进行连接,这一个过程符合「先描述,再组织」的「组织」。在操作系统与之下的各种文件系统之间,虚拟文件系统提供了标准的操作接口,让操作系统能够很快的支持新的文件系统。
2024-10-18 20:51:50
1540
2
原创 Windows系统下在VMware中配置Ubuntu环境并通过客户端进行连接
下载Ubuntu系统镜像直接进入网站点击Download即可,主要考虑下载VMware,因为当前VMware已经被收购了,所以官网已经关闭了,上面这个是一个CDS仓库,与官网下载的内容一样,进入该网站后可以看到下面的页面。如果出现了上面的界面,则选中「自动安装Windows Hypervisor Platform(WHP)」(对应的下面的选项,可以在对应位置手动启动)此处可以在「安装位置」更改VMware的安装位置,这里不会影响后面虚拟系统安装的位置,出现下面的警告直接点击OK即可。
2024-10-17 20:55:40
1039
C语言+数据结构学期课程设计《员工管理系统》
2024-07-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人