自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小何代码咖啡馆

小coder的学习记录

  • 博客(200)
  • 收藏
  • 关注

原创 C++ 17中的通用类型any

C++17引入的any类型可以存储任意类型的数据。其核心实现原理是通过多态和模板技术:定义一个基类Holder和模板子类PlaceHolder,Any类通过基类指针管理具体类型的数据。实现要点包括:类型安全的存储、拷贝/移动语义、动态类型转换等。测试代码验证了any类型能够正确存储和获取不同类型的数据,包括自定义类、整数和字符串。这种设计既避免了模板类的类型固定问题,又实现了类型安全的动态存储。

2025-06-03 20:27:15 463

原创 C++中的格式化字符串

格式说明符让您可以控制数据的呈现方式,语法为{[参数位置]:[格式说明]}int main()// 数值进制表示std::string hex = fmt::format("十六进制: {:#x}", number);// "十六进制: 0x2a"std::string oct = fmt::format("八进制: {:#o}", number);// "八进制: 052"std::string bin = fmt::format("二进制: {:#b}", number);

2025-04-28 22:08:30 1110

原创 Ubuntu下安装和卸载MySQL

下面的演示系统版本:Ubuntu 24.04。

2025-04-20 14:34:11 1036 1

原创 五种IO模型与select和poll分别实现多路转接

不论是在前面文件部分,还是后面的网络部分,IO都是非常常见的。但是当时只是简单对IO进行提及,并没有对IO的本质进行介绍。那么到底何为IO?IO全称为输入和输出,而任何一个IO过程都需要涉及到两个过程:所以,此处就可以得出一个关于IO的简单结论:IO实际上是由等待+拷贝两个行为构成的通过前面对、等接口的学习可以知道一个非常直观的现象:如果写方并没有写入内容,那么读方会进入阻塞;反过来,如果当前写方的缓冲区已满,那么写方也会阻塞。这里的两个阻塞本质上就是等待。对于这种存在一种等待条件的称为阻塞式IO,而从等待

2025-04-09 19:26:08 785

原创 关于C++日志库spdlog

int main()// 自定义日志格式// 记录日志return 0;: 时间戳(年-月-日 时:分:秒.毫秒)%^%l%$: 日志级别(带颜色)%v: 日志消息内容// 自定义 Sink 类protected:// 将日志消息转换为字符串// 输出到自定义目标(例如网络)// 刷新操作int main()// 记录日志return 0;除了上述预定义的宏函数,spdlog还允许用户定义自己的宏函数。

2025-04-09 19:21:32 979

原创 NAT技术、代理服务器和内网穿透

NAT(Network Address Translation,网络地址转换)是一种将私有(内部)网络地址转换为公有(外部)IP地址的技术。NAT主要用于解决IPv4地址短缺问题,同时提供了一定的安全性在前面网络层IP协议部分已经介绍过局域网内的主机向公网计算机发送数据的过程,但是当时并没有介绍公网机器向局域网内主机发送数据的过程。

2025-04-06 15:04:26 878 2

原创 数据链路层

局域网,是网络发明史中第一个诞生的网络。只要是某一个范围内部的计算机想要进行网络通信就必须要局域网,所以在局域网这个概念刚诞生时,每一个组织内部都有属于自己的局域网。随着时代的发展,最后使用最多的局域网就有了以太网,其他的还有例如令牌环网、无线网以太网本质上不算是一个单独的网路,而是局域网中的一个技术标准。其中既包含了数据链路层的内容,也包含了一些物理层的内容。例如规定了网络拓扑结构、访问控制方式、传输速率等。以太网之间的数据交互一般会使用双绞线,传输速率一般有10M、100M、1000M等。

2025-04-06 14:57:07 593

原创 网络层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 813

原创 Boost库搜索引擎项目(版本1)

/ 结果基本内容结构// 结构标题// 结果内容或描述// 网址读取到源文件目录下所有的HTML文件,将其拼接为一个字符串存储到vector中根据上一步得到的vector中的数据,取出每一个文件中的三个字段:文档标题、文档内容和文档在Boost官网的URL都存放到一个结构化对象中,再将该对象存储到一个vector中根据上一步结果的vector中每一个结构化数据读取并写入到一个文本文档raw,每一个结构化数据以一个\n分隔,而其中的成员以\3分隔- 根路径- data。

2025-04-05 09:18:44 1522

原创 C++17中的string_view库

C++17引入的是一个轻量级的、非拥有型(non-owning)的字符串引用类型,它提供了一个只读视图,指向已经存在的字符序列(如字符数组、等)。定义在头文件中,属于std命名空间。

2025-04-02 16:08:08 389

原创 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 1063

原创 C++17 filesystem库

C++17引入的filesystem库提供了跨平台的文件系统操作功能,使开发者能够以统一的方式处理路径、文件和目录操作,而不必担心不同操作系统间的差异。这个库最初源自,现已成为C++标准的一部分定义在头文件,定义在命名空间定义在头文件,定义在命名空间。

2025-03-29 15:14:29 969

原创 TCP协议原理

前面已经基本介绍了TCP编程的接口以及基本的步骤,但是并没有其中的原理进行解释。本篇主要聚焦于TCP原理部分,对TCP中重要的内容进行解释。

2025-03-23 17:27:06 727

原创 HTTPS协议介绍与原理

数字指纹(数据摘要),其基本原理是利用单向散列函数(哈希函数)对信息进行运算,生成一串固定长度的数字摘要数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。一旦数据被篡改,新的数字指纹就有很大的不同数据指纹常见算法:有MD5、SHA1、SHA256、SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据对比。

2025-03-23 17:20:12 582

原创 UDP协议原理

但是当时并没有具体谈论为什么UDP有以上三个特点,基于这个原因,本篇就会针对这三个原因进行介绍。

2025-03-20 22:16:17 405

原创 Linux与HTTP中的Cookie和Session

前面几篇已经基本介绍了HTTP协议的大部分内容,但是前面提到了一点「HTTP是无连接、无状态的协议」,那么到底有什么无连接以及什么是无状态。基于这两个问题,随后解释什么是Cookie和Session,以及二者是如何通过代码实现的HTTP最大的特点就是无连接和无状态所谓的无连接指的是HTTP请求服务器时不需要HTTP协议自己与服务器建立连接,由于HTTP是基于TCP的,所以整个连接工作交给了TCP,这一点在前面实现时也有所体现所谓的无状态指的是HTTP本身不会保存任何用户信息,举个例子,如果当前网站需要用户登

2025-03-20 22:12:19 1103

原创 Linux与HTTP报头属性和请求方式

在上面以及之前两节中,服务器都是向客户端直接响应字符串或者一个静态资源,但是有的时候不只有静态资源,还有很多的动态资源,例如在表单提交时form标签内的action字段的值就是对应的一个动态资源以一个实例表单为例:</在这个表单中,action。

2025-03-18 17:15:45 1052

原创 HTML4和HTML5标签总结,你想知道的全都有

HTML4和HTML5常见标签总结,作为复习使用

2025-03-18 17:14:55 406

原创 Linux与深入HTTP序列化和反序列化

在上一节已经完成了客户端和服务端基本的HTTP通信,但是前面的传递并没有完全体现出HTTP的序列化和反序列化,为了更好得理解其工作流程,在本节会以更加具体的方式分析到HTTP序列化和反序列化本节会在介绍HTTP协议基本结构与基本实现HTTPServer的基础之上继续完善HTTP服务器,所以需要有对应的知识作为铺垫才可以开始本节。

2025-03-15 22:11:17 1113

原创 介绍HTTP协议基本结构与Linux中基本实现HTTPServer

前面已经了解了协议的重要性并且已经定义了属于我们自己的协议,但是在网络中,已经有一些成熟的协议,最常用的就是HTTP协议在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如HTML文档)HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是一个基于TCP协议的。

2025-03-15 22:04:35 1565

原创 Linux中的序列化和反序列化与网络计算器

在前面UDP编程和TCP编程中,客户端和服务端之间传递的信息都是字符串,那么是否可以传递一个结构化的数据,例如前面聊天室中,传递一个类似于下面结构化的数据:实际上,如果是同一台计算机下,直接传递是完全可以的,因为同一台计算机对一个数据的封装和还原都是使用的同一个方式,但是在网络中,网络可能涉及到不同的操作系统,不同的计算机,其中就可能涉及到对结构化数据的设定,例如结构体的内存对齐问题,所以在网络中不建议之间传递结构化的数据,尽管在某些情况下可以既然不能使用结构化数据,但是又可以使用字符串形式的数据,那么有

2025-03-07 16:14:54 1149

原创 Linux中的TCP编程接口基本使用

在UDP编程接口基本使用已经介绍过UDP编程相关的接口,本篇开始介绍TCP编程相关的接口。

2025-03-07 16:09:00 1369

原创 Linux与UDP应用2:简易聊天室

在前面的基本使用过程中已经完成了本地和网络通信,既然一个人和一台服务器可以进行通信,那么多个人连接一台服务器也可以和这台服务器实现通信。在这个基础上,如果服务器可以将某个人发给服务器的消息转发给所有连接到当前服务器的客户端,就可以实现一个人发消息,其他人看到消息的效果,这就是简易聊天室的原理本篇就是利用UDP的操作实现上面提到的简易聊天室,其中客户端向服务端发送消息,服务端将收到的消息转发给所有连接到当前服务器的客户端需要注意,本次实现基于前面封装的服务端和客户端。

2025-03-01 20:47:45 827

原创 Linux与UDP应用1:翻译软件

dict.txt。

2025-03-01 20:41:38 1075

原创 Linux中的UDP编程接口基本使用

在前面网络基础部分已经介绍了网络的基本工作模式,有了这些理论基础之后,下面先从UDP编程开始从操作部分深入网络4. 整体代码优化:对常见属性进行封装,优化封装的服务端和客户端根据上面的内容,本次设计的服务器功能就是接受客户端发送的信息并向客户端返回服务端收到的信息。

2025-02-26 21:40:23 941

原创 Socket编程基础

在前面网络基础部分已经介绍过两台计算机需要通信就需要知道有源IP地址和目标IP地址,有了这一套地址就相当于有了大致方向。

2025-02-24 10:11:12 744 4

原创 网络基础知识

在计算机发展历程中,经历过下面四个阶段:独立模式:计算机之间相互独立,每台计算机做自己的事情,彼此之间没有直接信息传递。如果两台计算机需要通信就需要将当前计算机的数据通过某种方式拷贝到另一台计算,如下图所示:网络互联:多台计算机连接在一起,完成数据共享。示意图如下:局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起广域网WAN:将远隔千里的计算机都连在一起所谓「局域网」和「广域网」只是一个相对的概念之所以会逐渐发展为大范围的网络可以理解为主要原因是计算机是人的工具,人要协同工作。

2025-02-24 10:09:06 1385

原创 Linux线程安全与死锁

线程安全:就是多个线程在访问共享资源时,能够正确地执行,不会相互干扰或破坏彼此的执行结果。一般而言,多个线程并发同一段只有局部变量的代码时,不会出现不同的结果。但是对全局变量或者静态变量进行操作,并且没有锁保护的情况下,容易出现该问题重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数=== “常见的线程不安全的情况”

2025-02-22 14:29:59 554

原创 Linux与读者写者问题、读写锁、自旋锁

自旋锁是一种多线程同步机制,用于保护共享资源免受并发访问的影响。在多个线程尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。这种机制减少了线程切换的开销,适用于短时间内锁的竞争情况。但是不合理的使用,可能会造成CPU的浪费。

2025-02-22 14:27:56 680

原创 Linux线程池

线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络套接字等的数量,示意图如下:本次线程池的设计考虑设计固定数量的线程池。

2025-02-20 22:37:18 1268

原创 Linux日志系统

计算机中的日志是记录系统和软件运行中发生事件的文件,主要作用是监控运行状态、记录异常信息,帮助快速定位问题并支持程序员进行问题修复。它是系统维护、故障排查和安全管理的重要工具日志实际上也有一些现成的解决方案,例如spdlog、glog、Boost.Log、Log4cXx等等。

2025-02-19 20:56:56 1485

原创 生产者消费者模型(Producer-Consumer Model)

生产消费模型就是通过一个容器来解决生产者和消费者的强耦合问题。具体来说就是生产者和消费者彼此之间不直接通讯,而通过阻塞队列(即交易场所)来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔进阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的在本次实现中,首先考虑实现只有一个生产者和只有一个消费者的模式(单生产者单消费者),再进一步扩展到多生产者和多消费者的模式。

2025-02-18 10:16:28 1477

原创 Linux线程与信号量

因为在进程部分,让两个进程看到同一个资源比较麻烦,所以对应的接口也比较麻烦。创建信号量结构对象并初始化对应的计数器,使用sem_init接口进行初始化在操作资源之前先申请信号量,如果资源不足时进行等待,使用sem_wait接口进行在离开资源时增加信号量,使用sem_post接口进行不再使用信号量时销毁信号量结构对象,使用接口进行。

2025-02-18 10:10:36 791

原创 Linux线程互斥与同步

创建互斥锁,使用类型创建互斥锁变量初始化互斥锁,使用初始化互斥锁变量或者使用接口进行初始化进入临界区之前加锁,使用接口出临界区进行解锁,使用接口销毁互斥锁,使用接口对于创建互斥锁的两种方式:如果使用直接初始化互斥锁变量,那么就不需要使用对互斥锁变量进行初始化以及不需要使用对互斥锁进行销毁注意,不可以通过初始化赋值的形式初始化互斥锁变量创建条件变量,使用类型创建条件变量初始化条件变量,使用值或者使用接口进行初始化条件不成立时等待,使用接口使指定线程等待条件成立时唤醒,使用。

2025-02-17 11:31:43 813

原创 Linux线程库与线程库封装

id在线程操作部分提到了使用接口获取到当前线程的id这个结果实际上就是一个地址值,所以所谓的线程id实际上就是一个地址值而并不是LWP值,具体原因在接下来介绍线程库时即可解释。

2025-02-17 11:28:32 1028

原创 Linux线程概念与线程操作

前面提到进程=程序代码和数据+进程结构体,在线程部分就需要进一步更新之前的认识进程实际上承担分配系统资源的基本实体,而线程是进程中的一个执行分支,是操作系统调度的基本单位此处需要注意,操作系统并不是直接调用进程,而是调用线程,所以进程并不是操作系统调度的基本单位。

2025-02-14 18:54:31 1194 2

原创 Linux进程信号

在前面的进程状态与进程优先级部分提到,如果想要终止一个进程可以使用ctrl+c,其本质就是进程收到一个终止的信号所谓信号,就是一种用户、操作系统或者其他进程向目标进程发送异步事件的一种方式,而其中的异步事件表示不会立即处理的事件,因为进程收到信号之前一直在执行其代码,收到信号的那一刻之前进程并不知道自己会收到信号,当进程收到信号时,就需要做出对应的操作,此时进程可能并不是立即去完成对应的操作知道了何为信号,接下来就需要了解产生信号的方式。

2025-02-14 18:47:37 936

原创 Linux操作系统管理System V标准中三种资源的方式

msgsnd。

2025-02-13 17:48:39 933

原创 Linux消息队列与信号量

遵循System V标准的进程通信除了共享内存外还有消息队列,消息队列从其字面意思就是传递消息的一个队列。实际上,其作用与队列也是非常像的,但是它并不是语言的中间件消息队列与共享内存不同的是,消息队列可以同时让两个进程既可以从消息队列中读取数据,也可以向消息队列中写入数据,只不过进程读取数据时读取到的是另外一个进程写入的数据,而不是自己本身的数据,所以为了对消息队列中的数据作区分,除了数据本身外,还需要一个数据标识区分是哪一个进程写入的对应数据,示意图如下:ipcs -q。

2025-02-13 17:45:40 821

原创 Linux命名管道与共享内存

除了前面提到的两个管道可以进行进程通信外,共享内存也是一种方式,但是共享内存是System V标准下的进程间通信方式。共享内存本质就是在内存上开辟一块空间并将其链接到两个进程的PCB中,从而让两个进程都能看到同一块资源,进而实现进程间通信,具体原理如下图所示:在上面的原理图中,将共享内存通过页表链接到进程PCB的过程叫做挂接,当进程PCB与共享内存断开连接的过程叫做去关联。

2025-02-12 22:49:07 1060

MySQL基础使用笔记

MySQL基础使用PDF,一共18章,带你扫除MySQL基础使用的障碍

2024-08-29

HTML与CSS笔记.zip

最新HTML与CSS笔记,助力前端基础

2024-08-23

C语言+数据结构学期课程设计《员工管理系统》

关于一个员工管理系统的开发,详细描述了如何构建一个具备基本功能的员工信息管理软件。系统的核心目标是有效地组织和维护员工的个人及工作相关数据,确保数据的准确性和易于访问性。 系统的主要特点包括: 员工信息管理:每个员工的记录包含编号、姓名、性别、出生日期、学历、职务、电话号码和住址。 数据持久化:系统能够将员工数据保存到文件中,以便在程序关闭后数据不会丢失,并且在下次启动时能从文件中恢复这些数据。 数据检索:支持按ID或姓名查找员工的具体信息。 数据更新:允许管理员根据员工的编号修改其个人信息。 数据录入:具备添加新员工信息的功能。 数据移除:可以按员工编号删除不再在职的员工记录。 数据排序:能够按照员工的ID、姓名或出生日期对所有员工信息进行排序。 数据展示:可以列出所有员工的信息,或者展示排序后的员工列表。 在技术实现上,文档采用了C语言编程,并利用了动态顺序表作为存储结构,这使得数据的增删改查更加高效。此外,还设计了一系列函数来实现上述各项功能

2024-07-21

空空如也

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

TA关注的人

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