自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Cookie与Session

(Web Cookie / 浏览器 Cookie,简称 Cookie)是服务器发送到用户浏览器、并保存在浏览器上的一小块数据。浏览器之后向同一服务器再次发起请求时,会自动把它携带上并发送回服务器。它的典型用途是告知服务端两个请求是否来自同一浏览器,比如保持登录状态、记录用户偏好。是服务器用来跟踪用户与服务器交互期间用户状态的机制。因为 HTTP 无状态(每个请求独立),服务器需要 Session 来记住用户信息。机制存哪解决什么一句话Cookie浏览器让请求"自带身份"

2026-10-19 20:57:20 392

原创 HTTP协议基础

整理自《Linux 网络编程 / 5 应用层协议HTTP》,结合自己写的 SocketTCP HTTP 服务器实测补充。适用:复习 + 可直接粘到 优快云。

2026-10-16 00:16:15 158

原创 序列化与非序列化

⭐无论采用方案一、方案二还是什么别的方案,只要保证:一端发送时构造的数据,在另一端能够被正确地解析,就是 OK 的。这种约定,就是应用层协议。也就是说,协议没有标准答案。也可以那样约定。只要收发两端对得上就行。为了让大家真正理解协议的细节,我们才"手搓"一遍协议定制的全过程。环节做法目的协议格式采用方案二(结构体)体现协议定制的细节与字段的自描述能力序列化直接用现成轮子 ——Jsoncpp 库避免把时间浪费在字符串切割上,同时也贴近工程实践传输层对 socket 做字节流读取处理。

2026-10-12 20:21:02 365

原创 TcpSocket

listensock = 一个监听端口的内核对象句柄队列 = 这个对象上的两个附属数据结构(半连接队列 + 全连接队列)accept = 通过这个句柄访问它的已完成连接队列,内核创建新的 connfd 返回的作用不只是"提供挂接队列的空间",它还是监听端口的内核代表对象承载 bind 的 IP + 端口标记 LISTEN 状态在内核监听端口哈希表中注册挂接两个队列作为accept()的入口。

2026-10-11 21:11:23 338

原创 SocketUdp

in_addr_t/* Address to accept any incoming messages. */ # define INADDR_ANY((in_addr_t) 0x00000000) // 即 0.0.0.00x00000000/* Address to accept any incoming messages. */ # define INADDR_ANY((in_addr_t) 0x00000000) // 即 0.0.0.0。

2026-10-11 18:24:24 329

原创 linux网络编程基础

│ 应用层 HTTP / FTP / SSH ... ← 网络编程针对这一层 ││ 传输层 TCP(可靠/有连接/字节流) UDP(不可靠/无连接/数据报) │ ← 端口号│ 网络层 IP —— 地址管理 + 路由选择 │ ← IP地址,屏蔽底层差异│ 链路层 以太网 —— 帧传送/帧同步/冲突检测/CRC校验 │ ← MAC地址,局域网转发│ 物理层 双绞线 / 光纤 / 电磁波 │ ← 决定速率、距离、抗干扰报文 = 报头 + 有效载荷 段(传输层) / 数据报(网络层) / 帧(链路层)

2026-10-11 18:02:56 212

原创 线程同步互斥

线程安全可重入纯局部变量函数✅✅只读全局变量函数✅✅加锁保护的全局变量函数✅❌(信号场景死锁)无保护的可写全局变量函数❌❌核心结论:可重入 → 一定线程安全(记住这句就够了)线程安全 → 不一定可重入(加锁的函数就是反例)不可重入 → 不一定线程不安全(加锁后线程安全,但信号场景仍会死锁)有全局变量 → 看是只读还是可写、有没有保护。

2026-08-25 11:35:54 160

原创 线程控制操作

在头文件中直接定义非 inline 变量(如 int count;),在多文件包含时会导致重复定义链接错误。修复:使用 inline std::atomic count{0};。Start() 状态检查:只允许 THREAD_NEW 启动,防止重复创建。Join() 返回值判断:使用 n!= 0 判断失败,而非 n == -1。析构函数兜底:自动 join 运行中的线程,防止主线程退出导致子线程被强杀或资源泄露。状态闭环:Run 函数末尾强制设置 THREAD_STOP。Detach 互斥。

2026-08-25 11:05:15 335

原创 线程的理解

为了保证多线程能独立运行而不互相干扰,每个线程必须有自己的一套“私有成员。这是一个极易混淆的点,必须区分。

2026-08-15 22:52:40 368

原创 Linux 信号机制

一个函数在被执行的过程中被中断,并在处理完中断后再次进入该函数,依然能够正确运行,不破坏任何共享数据。

2026-08-12 23:10:40 338

原创 信号量简介

一句话概括:信号量是一个带有“睡眠队列”和“自动回滚机制”的原子计数器。它通过内核级的阻塞与唤醒机制,实现了高效的进程同步与互斥,同时保证了系统的健壮性。

2026-08-11 15:59:05 231

原创 #Linux 内核 IPC 资源组织架构

这套架构既保证了管理的统一性,又保留了各类 IPC 机制的灵活性,是操作系统设计中“面向对象”思想的经典体现。

2026-08-11 15:56:04 190

原创 进程间通信

命名管道是为了解决匿名管道只能用于亲缘进程通信的局限而设计的 IPC 机制。它允许任意两个无亲缘关系的进程,通过一个文件系统路径名进行数据交换。匿名管道是 Unix 中最古老的 IPC 形式。它就像一根连接两个进程的水管,一端进水(写),一端出水(读)。它没有名字,只存在于内存中。管道是 Unix 中最古老的进程间通信形式,本质是内核中的一块缓冲区,连接两个进程的数据流。的一种,它允许多个无亲缘关系的进程直接访问同一块物理内存区域,实现数据的高速交换。共享内存是所有 IPC 形式中。

2026-08-11 12:46:54 179

原创 IO 基础

决定了文件的基础访问模式和行为控制,通常通过位或运算符 (重定向就是改变文件描述符(如 0, 1, 2)的指向。决定了新文件的初始权限。open的返回值就是文件描述符fd。如果你使用的是 C 语言标准库的。创建新文件时,第三个参数。权限参数,而是通过字符串。) 以及缓冲区指针等信息。

2026-07-24 16:12:23 333

原创 Linux I/O 重定向

看数字:没有数字前缀默认是1(stdout)。等同于1>。看符号:单箭头是覆盖,双箭头>>是追加。看顺序:合并输出时,永远记住,先定向文件,再复制指针。看需求:不要的垃圾扔进/dev/null,多行文本用<< EOF。

2026-07-24 10:43:26 280

原创 Linux进程控制

fork函数用于从一个已存在的进程(父进程)中创建一个新进程(子进程)。

2026-07-22 22:25:53 289

原创 进程概念与底层

现代计算机大多遵循此体系,核心原则是。(注:运算器 + 控制器 = 中央处理器 CPU)

2026-07-22 19:32:41 303

原创 Git版本控制器

在首次使用 Git 时,需要配置提交代码时的用户信息:git config --global user.name “你的用户名”git config --global user.email “你的邮箱”

2026-07-22 15:03:25 214

原创 GDB调试器

要使用 GDB,编译时必须加上-g选项,建议同时关闭优化:-g-O0。

2026-07-22 14:30:00 340

原创 make基础

变量说明使用wildcard函数获取当前目录下所有.c文件将SRC中所有.c后缀替换为.o,得到目标文件列表定义最终生成的可执行文件名CC = gcc指定编译器为gccmake 只管文件的依赖性它会一层一层地检查依赖关系如果依赖关系链完整,就执行对应命令如果某个依赖文件找不到且没有生成它的规则,make 就报错退出make不关心命令执行是否成功,只负责执行命令Makefile 设计的核心规则:最终目标是第一个目标,所以要把最终要生成的文件写在最前面。

2026-06-11 22:31:48 186

原创 gcc/g++

才将它们链接在一起,而不是像静态链接那样把所有模块都链接成一个单独的可执行文件。文件,为了满足依赖关系,需要将这些目标文件进行链接,形成可执行程序。在实际开发中,多个源文件之间存在依赖关系。命令用于打印程序或者库文件所依赖的共享库列表。动态链接把程序按模块拆分成相对独立的部分,在。是编译器的优化选项的 4 个级别,函数并没有在代码中定义实现,函数——这就是链接的作用。会到系统默认搜索路径。

2026-06-11 22:12:44 215

原创 vim基础操作

模式说明正常模式默认模式,用于移动光标、删除、复制、粘贴等操作插入模式用于输入文字底行模式(末行模式)用于保存、退出、查找、设置行号等操作注:Vim 共有 12 种模式,以上三种是最常用的核心模式,其余模式可自行进一步研究。

2026-06-11 22:00:12 327

原创 C++11(三)

C++98 的 6 个默认成员函数:构造函数、析构函数、拷贝构造函数、拷贝赋值重载、取地址重载、const取地址重载。核心重点:前 4 个函数最为重要,后 2 个用处不大。默认行为:如果不手动编写,编译器会自动生成默认版本。C++11 新增 2 个默认成员函数:移动构造函数、移动赋值运算符重载。在需要实现多种自定义比较逻辑时,Lambda 的优势尤为明显。传统仿函数做法// 名字// 价格// 评价// 需要为每一种比较规则单独定义一个结构体int main()

2026-06-09 23:58:55 238

原创 Linux基础指令(二)

从 1970 年 1 月 1 日(UTC/GMT 的午夜)开始所经过的秒数,不考虑闰秒。

2026-05-19 23:07:57 392

原创 C++11(二)

这意味着一个右值被右值引用绑定后,右值引用变量(即函数形参。C++11 以后,进一步对类型进行了划分,右值被细分为。参数看起来像是一个普通的右值引用参数,但由于。因此,有些地方也把这种函数模板的参数叫做。)本身的属性是左值。,那么匹配的永远都是左值引用版本的。本质是一个函数模板,主要通过。,我们需要使用完美转发。

2026-05-14 15:27:21 382

原创 C++11(一)

C++98 中的引用现在称为左值引用。C++11 新增了右值引用语法特性。无论是左值引用还是右值引用,本质都是给对象取别名。

2026-05-01 21:07:57 378

原创 哈希表(一)

也就是说直接定址法本质就是用关键字计算出一个绝对位置或者相对位置。

2026-04-15 16:11:20 432

原创 set和map容器

是 C++ 标准模板库(STL)中的一种关联容器,用于存储有序且允许重复的元素。map是 C++ 标准模板库(STL)中的一种关联容器,用于存储键值对。它与set的核心区别在于,map中的每个元素都包含一个关键字(Key)和一个关联的值(Value)。std::pair是 C++ 标准模板库(STL)中的一个模板类,用于将两个不同类型的数据组合成一个单一的对象。它在map等关联容器中扮演着核心角色,因为map的每个元素本质上就是一个键值对。

2026-04-14 00:19:58 354

原创 二叉搜索树

要保持逻辑一致性,即在整个插入过程中,对于相等值的处理方向必须统一(不要一会儿往右走,一会儿往左走)。二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义。把 N 结点的父结点对应孩子指针指向 N 的右孩子,直接删除 N 结点。把 N 结点的父结点对应孩子指针指向 N 的左孩子,直接删除 N 结点。如果支持插入相等的值,当插入值与当前结点的值相等时,可以选择向。把 N 结点的父结点对应孩子指针指向空,直接删除 N 结点。首先查找元素是否在二叉搜索树中,如果不存在,则返回。

2026-04-13 23:43:30 415

原创 Linux基础指令

绝对路径相对路径语法:功能:语法:功能:显示用户当前所在的目录(Print Working Directory)常用选项:语法:功能:改变工作目录。将当前工作目录改变到指定的目录下。常用用法:在Linux中,文件不仅仅是存储数据的容器,还包含多种属性。 命令主要用于操作这些属性中的时间戳。语法:功能:在当前目录下创建一个名为“dirname”的目录。常用选项:补充说明: 是一个与 相对应的命令, 是建立目录,而 是删除命令。语法:适用对象:具有当前目录操作权限的所有使用者功能:删除空目录(如果目录不为空

2026-04-13 16:55:19 390

原创 C++多态

多态是指在继承关系下,不同的类对象调用同一函数时,产生了不同的行为。示例Student类继承了Person类。Person全价Student优惠简单来说,vptr是一个隐藏在类对象内部的指针。归属:它属于对象(实例)。作用:它指向该对象所属类的虚函数表(vtable)。目的:为了让程序在运行时,能够根据对象的实际类型,找到并调用正确的虚函数版本(即实现动态绑定每个拥有虚函数的类,都会有一个属于自己的、独立的虚函数表。特性说明名称虚函数表指针 (_vptrvfptr存储位置。

2026-04-08 15:37:44 367

原创 C++特性——继承

在 C++ 中,继承(Inheritance)允许我们基于一个现有的类(基类/父类)来创建一个新的类(派生类/子类)。派生类自动拥有基类的非私有成员(数据成员和成员函数),并可以添加新的功能或重写现有功能。本质上,继承体现了“Is-A”(是一个)的关系。例如,“学生”是一个“人”,“猫”是一个“动物”。这种关系建立了类的层次结构,使得代码可以从抽象到具体逐步细化。如果基类指针实际指向的是一个纯粹的基类对象,而你强行将其转换为派生类指针并访问派生类特有的成员,程序将发生内存越界。原理。

2026-03-18 16:25:56 458

原创 C++ 模板链接问题

头文件的本质是展开,所以对于各个.cpp文件编译时,实际上是该.cpp文件中就已经包含了模板函数的定义,如果需要使用该模板函数,就一定会在当前文件中实例化它,那么此时他有了确定类型,就可以生成汇编代码,拥有函数地址,可以在符号表中找到了。依旧将模板函数声明在头文件中,但是将定义定义在.cpp文件中,同时在该文件提前实例化//此处语法为了区分,没有<class T>int(int, int);//此处语法为了区分,没有<class T>

2026-03-11 17:27:59 360

原创 C++ 模板进阶

和。理解它们的区别是掌握模板高级用法的基础。

2026-03-10 22:44:31 370

原创 priority_queue 容器适配器(仿函数运用)

是 C++ 标准模板库(STL)中提供的容器适配器(Container Adapter)。它并不是一种独立的数据结构,而是基于其他序列容器(默认为 )构建的,通过堆(Heap)算法来维护元素的顺序,确保优先级最高的元素始终位于队首。与普通队列(FIFO,先进先出)不同,优先队列中的元素出队顺序完全取决于它们的优先级,而非插入顺序。 的定义如下:2. 模板参数详解 的模板定义包含三个关键参数:

2026-03-07 00:20:43 340

原创 deque容器——双端队列

构造deque支持默认构造、填充构造(指定数量和初始值)以及范围构造(从其他容器复制)。size()vsempty():虽然也能判断空,但empty()语义更清晰且在某些实现中效率略高。resize():常用于预分配空间或截断数据。如果扩大,新增部分会被值初始化(基本类型为 0,类类型调用默认构造函数)。

2026-03-04 18:45:16 439

原创 容器适配器stack与queue

在计算机科学和数据结构中,std::stackstd::queue它们不是独立的容器dequelistvector。

2026-02-26 21:02:38 367

原创 algorithm常用函数

所有列出函数均属于。

2026-02-24 11:06:41 72

原创 list容器简介及其接口函数

list是 C++ 标准模板库(STL)中的,定义在<list>头文件中。与vector不同,list中的元素在内存中,每个元素都包含指向前后元素的指针。

2026-02-22 10:39:26 785 1

原创 迭代器简介及其失效问题

即使程序看似“正常运行”。

2026-02-14 21:27:01 106

空空如也

空空如也

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

TA关注的人

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