- 博客(330)
- 收藏
- 关注
原创 【Linux网络】Linux 网络编程:应用层自定义协议与序列化(3):网络计算器实现和守护进程
TCP 本质面向字节流的传输协议,没有报文边界。粘包原因:客户端write次数 ≠ 服务端read次数,多个报文会被粘连或截断。危害:直接解析 JSON 会失败、程序崩溃、数据错乱。解决方案应用层自定义协议,手动定义报文边界,保证报文完整性。协议格式:报文长度 + \r\n + JSON 串 + \r\n设计思路:先读长度字段,知道完整报文长度,再读取对应长度的数据,确保报文完整。分隔符:使用\r\n,符合 HTTP 等通用协议,不易与 JSON 数据冲突。
2026-05-12 12:29:04
1053
21
原创 【Linux网络】Linux 网络编程:应用层自定义协议与序列化(2)序列化与反序列化
摘要:本文从 TCP/UDP 通信本质、Linux 内核报文管理入手,系统讲解应用层自定义协议设计、序列化 / 反序列化原理与工程实践,并以网络计算器为例完整实现,彻底解决 TCP 粘包问题,适合后端开发、网络编程学习者系统掌握网络编程不只调用 socket API,业务数据需要结构化传输、跨平台 / 跨语言互通、可靠解析。传输层只负责数据搬运,不理解业务语义 ——必须在应用层约定协议、做序列化、处理报文边界。协议 = 通信双方约定的结构化数据structclass),包含字段含义、顺序、解析规则。序列化。
2026-05-12 11:39:10
2840
14
原创 【Linux网络】Linux 网络编程:应用层自定义协议与序列化(1)初识
本文核心讲解Linux 下 TCP 网络 I/O 的本质:数据从主机 A 到主机 B 必须经过应用层序列化→用户态拷贝到内核发送缓冲区→内核协议栈传输→拷贝到对端内核接收缓冲区→应用层反序列化的完整流程;网络 I/O 本质是内存拷贝,TCP 全双工依靠一对收发缓冲区实现,面向字节流会引发粘包问题,必须通过应用层自定义协议 + 序列化 / 反序列化保证报文完整性。
2026-05-09 19:05:18
692
19
原创 【Linux网络】Linux 网络编程入门:TCP Socket 编程(下)
服务端socket->bind->listen->accept->多执行流(进程/线程/池)->readwrite客户端socket->connect->收发数据命令执行:底层,高层popen封装。安全:远程执行命令必须使用白名单机制。TCP 本质:全双工、字节流、面向连接的可靠传输协议。应用层必须自己处理消息边界和数据完整性问题。
2026-05-09 19:03:04
499
20
原创 【Linux网络】Linux 网络编程入门:TCP Socket 编程(上)
🎬 艾莉丝的简介:这怎么理解?我们讲一个故事就好理解了。五一出去旅行,到旅游景点必然要吃饭,有各种饭庄、餐厅,这些饭庄也卷,卷到什么程度?专门派出一个人站在路口拉客,张三是“好再来鱼庄”的顶级销售:我和朋友来西湖溜达的时候就被张三忽悠瘸了,拉进鱼庄吃饭了,进鱼庄的时候张三吆喝一声:“来客人了,后厨来个服务员”,这时候出来一个李四,给我和朋友提供服务,有需求就找服务员李四,当我们吃饭的时候张三在干什么?继续忽悠新客人。这时候后厨又出来一个王五,为新客人服务。张三的核心工作是拉客,张三每拉一个客人,就会有一个
2026-05-06 07:41:40
493
34
原创 【Linux网络】Linux 网络编程入门:UDP Socket 编程(下)
完全解耦:网络层与业务层完全分离,UdpServer可复用生产级日志:支持控制台/文件双输出,线程安全可扩展性强:字典数据从外部文件加载,无需修改代码即可扩展完善的错误处理:文件错误、网络错误、格式错误均有处理线程安全:所有共享资源访问均加锁保护默认控制台日志:程序启动时自动启用切换到文件日志:在main函数开头调用日志等级:从低到高为DEBUG < INFO < WARNING < ERROR < FATAL日志格式。
2026-05-01 01:19:44
1452
49
原创 【Linux网络】Linux 网络编程入门:UDP Socket 编程(上)
这个是UDP的灵魂!recvfrom 每个参数真实意义为什么 UDP 必须 recvfromsrc_addr 的真正价值返回值三种情况如何知道“是谁发来的数据”如果说 socket() 是创建通信能力,bind() 是让别人能找到你,那么 recvfrom()才是服务器真正开始“工作”的地方。我们正式开始。当socket()和bind()socket();bind();IP + Port。也就是说,别人现在可以向你发送数据了。等待客户端发来数据。这一步就是通过。
2026-05-01 01:18:37
1598
66
原创 【Linux网络】计算机网络入门:Socket编程预备,从字节序共识到 Socket 地址结构的“伪多态”设计
在网络通信中,底层细节往往决定了系统的稳定性。为什么网络字节序一定是大端?Socket 地址结构为什么要强制转换?以及 UDP 核心传输函数的逻辑。不同硬件架构(如 x86 和 ARM)对多字节数据的存储方式存在分歧,这被称为“大小端”问题。大端 (Big-Endian): 高位存低地址(符合人类直觉)。小端 (Little-Endian): 低位存低地址(符合机器加法逻辑)。网络标准: TCP/IP 协议族规定,网络数据流一律采用大端序。
2026-04-27 14:03:10
1861
52
原创 剑指巅峰,磨砺芳华:我的 CSDN 创作一周年深度总结
uu们,大家好。我是艾莉丝努力练剑。2026年4月26日。在这个看似平凡的午后,当我习惯性地打开 CSDN 后台,系统推送的一封纪念信跳入眼帘:“艾莉丝努力练剑,有幸再次遇见你:还记得 2025 年 04 月 26 日吗?你撰写了第 1 篇技术博客:《C语言学习的第一篇blog》……今天,是你成为创作者的第 365 天。那一刻,某种奇妙的宿命感油然而生。365天,321篇原创文章,60余万次访问。
2026-04-26 13:34:07
3350
41
原创 【Linux网络】计算机网络入门:网络通信——跨主机的进程间通信(IPC)与Socket编程入门
通信是进程间的博弈。封装是各司其职的协议实现。IP/MAC配合是跨越千山万水的保证(记住:IP 不变,MAC 一直变)。字节序是跨越硬件差异的语言统一。理论已经扎实,下一篇我们将进入代码实战,去拆解那个承载了所有协议信息的关键结构体 ——sockaddr。
2026-04-24 16:10:56
2020
36
原创 【Linux网络】计算机网络入门:协议不是玄学,从结构体到快递单,彻底搞懂网络封装与通信
各位同学,在开始聊那些枯燥的 OSI 七层模型或 TCP/IP 五层协议之前,我们先回想一下学生时代传纸条的场景。如果你给心仪的女生传一张纸条,上面写着1314。如果她提前没跟你对过“暗号”,她可能觉得你是在显摆数学。但如果你们私下约定好:纸条上的第一个数字代表“心情”,第二个数字代表“想说的话”,那么她一眼就能读出你的心意。这个提前约定好的“格式”,就是协议(约定)。在计算机世界里,协议从来不是什么玄学,它是冷冰冰的、写在内核源码里的 C 语言结构体。协议是结构体:它是共识的肉身。封装是贴单。
2026-04-24 12:09:27
9988
48
原创 【Linux网络】计算机网络入门:从背景到协议,理解网络通信基础
好久不见!(小声BB:好像也没有好久)uu们!我是艾莉丝努力练剑。Linux的系统部分终于是聊完啦!今天,我们要聊一个既熟悉又陌生的核心话题——计算机网络。在这个低头看手机、抬头看电脑的时代,网络像空气一样无处不在。但你是否思考过:两台原本互不相干的计算机,是如何跨越千山万水,准确无误地交换一张图片或一段文字的?这篇博客将带你拨开技术的迷雾,从网络诞生的历史脉络讲起,深入剖析协议的本质与操作系统的底层实现。无论你是零基础小白,还是想要温故知新的开发者,希望这篇文章能成为你理解网络通信的基石。
2026-04-22 00:57:32
9394
51
原创 【Linux线程】Linux系统多线程(十):线程安全和重入、死锁相关话题
线程安全是用“管理共享资源”的手段来解决并发冲突。可重入是用“不使用共享资源”的手段来从根源消除冲突。简单来说,线程安全就是“不出问题”。当多个线程像一群疯狂的食客一样涌向同一个共享资源(比如全局变量、静态变量)时,如果你的代码能够保证逻辑执行结果依然符合预期,不会因为执行流的交错而导致数据错乱,那它就是线程安全的。这是一个比线程安全更底层、也更容易被忽视的概念。重入(Reentrancy)描述的是函数的属性:同一个函数被不同的执行流同时调用。多线程重入:线程 A 正在执行func。
2026-04-22 00:51:26
583
40
原创 【Linux线程】Linux系统多线程(九):线程池实现(附代码示例)
在高性能服务器开发中,“线程池”是一个绕不开的话题。你是否好奇过——为什么像 Nginx、Redis( 6.0 后)或者 Java 的底层都要维护一个池子?今天,我们就脱离复杂的库函数,从底层原理出发,手写一个高性能、生产级的 C++ 线程池。线程池的设计本质是对系统资源分配权的收回。通过封装pthread接口与同步原语,开发者构建出了一个能够自我管理的逻辑执行层。
2026-04-20 02:16:02
6123
47
原创 【Linux线程】Linux系统多线程(八):<策略模式>日志系统的封装实现
01234互斥锁是并发控制的基础,必须保证“加锁-业务-解锁”的闭环。生产消费模型是处理高并发数据的标准范式,核心在于缓冲区的管理。日志系统封装体现了面向对象设计的思想,利用 C++RAII机制(析构函数自动处理)可以极大简化代码调用。预定义宏__FILE__和__LINE__是定位 Bug 的利器,务必集成到日志中。
2026-04-20 01:29:35
723
51
原创 【Linux加餐】mmap文件映射
在 Linux 系统编程的硬核世界里,如果说readwrite是我们开启文件大门的钥匙,那么mmap就是一道直接穿透墙壁的“传送门”。它让我们可以像操作内存中的数组一样直接读写磁盘文件,优雅而高效。MAP_SHARED 像是在云端协同办公,大家改的内容都能实时保存到源文件。MAP_PRIVATE 像是你下载了一个副本,随便你怎么改,源文件巍然不动(写时复制)。
2026-04-16 12:25:59
739
47
原创 【Linux线程】Linux系统多线程(七):<线程同步与互斥>线程同步(下)
在多线程并发环境中,协调不同执行流对共享资源的访问是系统级开发的核心难点。根据文档描述,为解决这一问题,系统引入了互斥与同步机制。互斥机制(Mutex)保证任何时刻有且只有一个执行流能够进入临界区访问临界资源,以维护操作的原子性。同步机制则在保证数据安全的前提下,使线程按照特定的顺序访问资源,有效避免线程饥饿并解决竞态条件。在生产者消费者模型中,引入阻塞队列(BlockingQueue)或环形队列(RingQueue)作为数据缓冲区,能够实现生产者与消费者的极度解耦,支持高并发并解决处理速度不均的问题。
2026-04-16 12:07:55
523
8
原创 【Linux线程】Linux系统多线程(六):<线程同步与互斥>线程同步(上)
这段代码是典型的生产消费模型标准实现,它在底层通过的原子释放特性,完美绕过了“持有锁时挂起”这一死锁禁区。(1)优点: 严谨使用了while判定和RAII思想(虽然是手动初始化,但逻辑闭环)。(2)底层映射: * 原子性:pushpop在锁内。同步性: 靠两个信号通知机制。死锁预防: 靠wait接口内部的“解锁-挂起-加锁”原子序列。
2026-04-14 13:09:13
705
33
原创 【Linux线程】Linux系统多线程(五):<线程同步与互斥>线程互斥
在系统级编程的宏大架构中,并发往往伴随着最隐蔽、最致命的数据灾难。多线程虽然能通过并行计算极大提升程序的吞吐量,但如果缺乏严谨的同步与互斥机制,原本高效的 C/C++ 代码就会沦为制造薛定谔 Bug 的温床。今天,我们将穿透高级语言的迷雾,直击 CPU 体系结构与硬件上下文,深度剖析 Linux 线程互斥与锁的本质。
2026-04-14 12:56:57
642
64
原创 【QT】Qt常用控件与布局管理深度解析:从原理到实践的架构思考
在桌面端GUI开发中,界面组件的复用性、自适应能力、资源可移植性及交互流畅度,是决定开发效率与产品体验的关键瓶颈。传统GUI开发中,控件绝对定位导致的界面错乱、资源路径依赖引发的部署失败、布局嵌套不合理造成的性能损耗,以及控件交互逻辑与业务逻辑耦合过高的问题,长期困扰开发者。Qt作为成熟的跨平台GUI框架,通过封装统一的控件体系、布局管理器与资源管理机制,从架构层面解决了上述痛点。其核心设计哲学是“组件化封装、声明式布局、信号槽解耦”,既保证了跨平台一致性,又降低了GUI开发的复杂度。
2026-04-10 22:39:14
797
53
原创 【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
🎬 艾莉丝的简介:线程ID不是LWP,而是地址,并且是虚拟地址!!!属于 !到底是什么类型呢?取决于实现。对于Linux目前实现的NPTL实现而言,pthread_t类型的线程ID,本质就是一个进程地址空间上的一个地址。我们要理解“Linux 线程库 (pthread) 的加载原理以及它在虚拟地址空间中的映射关系”。库的制作与原理那里提过:Linux内核没有直接的线程概念,而是给我们提供用户级的pthread库,在当前的新的ubuntu系统下:pthread动态库:我们主要来聊聊这个动态库,你的程序要加
2026-04-10 17:56:22
769
37
原创 【Linux线程】Linux系统多线程(三):Linux线程 VS 进程,线程控制
为了解耦。主线程只管发指令,子线程通过结构体拿数据,互不干扰。(1)在实验中是用来判断分离是否成功的“检测器”。(2)sleep(1)是为了让子线程在竞争中“跑赢”主线程,确保分离状态先被设置。(3)必须警惕主线程退出导致分离子线程被动“夭折”的工业事故。线程分离的本质是管理权的移交(1)默认状态 (Joinable): 类似于父子关系,主线程负有监护责任,必须负责最后的资源回收。(2)分离状态 (Detached)
2026-04-08 16:38:37
537
13
原创 C++ 核心编程练习:从基础语法到递归、重载与宏定义
🎬 艾莉丝的简介:编写程序,用一个函数判定输入的某个数是否为素数。2 统计奇偶数从键盘依次输入一列整数(输入0结束),编写函数,统计输入的整数序列中的奇数个数和偶数个数,在主函数中调用该函数并求输入的整数序列中的奇数个数和偶数个数。3 带默认参数的阶乘定义一个带默认参数值的函数求 n!n!n!,在主函数中调用两次该函数,一次给出实参,另一次不给实参,体会默认值的意义。4 求 a!+b!+c!a! + b! + c!a!+b!+c!求 a!+b!+c!a!+b!+c!a!+b!+c! 的值,要求
2026-04-08 00:59:42
497
11
原创 【Linux系统:多线程】线程概念与控制
(1) 在 Linux 内核中,线程被称为轻量级进程(LWP, Light Weight Process)。(2) 传统的进程模型中,一个进程对应一个地址空间,对应一个 task_struct;但在 Linux 线程模型中,多个 task_struct 指向同一个 mm_struct(进程地址空间)。(3) 线程是“一个进程内部的控制序列”,它在进程的虚拟地址空间内运行。(4) CPU 在进行调度时,并不区分进程和线程,它只认 task_struct。
2026-04-07 11:23:44
642
57
原创 【Linux系统:信号】线程安全不等于可重入:深度拆解变量作用域与原子操作
在一个函数中若对局部变量进行了原子操作,则这个函数一定是不可重入的这个表述正确吗?这个观点是不正确的。“使用了原子操作”与“函数是否可重入”之间没有必然的因果关系。事实上,在一个函数中对局部变量进行原子操作,通常并不会导致函数变得不可重入。(1) 不使用全局变量或静态变量。(2) 不返回指向静态数据的指针。(3) 所有数据由调用者通过参数提供(使用调用者的栈空间)。(4) 不调用任何不可重入的库函数。
2026-04-05 21:51:05
521
35
原创 【Linux系统:多线程】Linux 内核与多线程深度强化干货25条
(1) 地址物理性:二级指针实验证明了 C 语言修改外部指针必须传地址。(2) 调度随机性:传局部变量实验证明了主线程和子线程的异步竞争。(3) 内核强制性:信号实验证明了内核位图屏蔽逻辑在 9 号信号面前会自动失效。这套代码配上之前的 25 条笔记,绝对是物理级的说服力。(1) 内存分配malloc出来的是独立的“名牌”,局部变量是共用的“白板”。(2) 内核位图:信号在内核里就是一串0/1,你屏蔽(Block)只是让内核不去看它,但 9 号信号内核会绕过检查。(3) 二级指针。
2026-04-04 02:02:19
6685
36
原创 【Linux线程】Linux系统多线程(二):线程的优缺点
最值得讲的线程的缺点其实是健壮性降低,一个线程异常,全进程内部的线程遭殃,整个进程出问题!一个线程异常,整个进程内部的线程全部都遭殃,整个进程出问题!我们故意让一个线程出异常:运行:再去查,三个线程全挂了!了。为什么?因为线程是进程内部的执行分支,线程在执行这个工作的时候,线程除0就相当于进程除0,都属于一个团队内部,你线程就是在替进程做事的。一个线程出现异常的本质是什么?是收到信号(当然这之间还有中断的事)——OS给你这个LWP发送的。信号是以进程为单位为载体发送的。
2026-04-02 09:50:23
706
63
原创 【Linux线程】Linux系统多线程(一):线程概念
这里的叫做轻量级进程。系统当中,线程个数比进程更多。线程是在进程的地址空间内部:线程也有自己的唯一性标识——线程也需要被操作系统管理起来,那必然要有一个结构体,。线程在OS内如果存在,那么就一定会存很多?OS也就必然要对线程进行管理——要管理,那必然是“先描述,再组织”。线程内部是不是有自己的结构呢,也有状态也有优先级。线程要作为进程的一部分,PCB 里面是不是还会维护一个线程链表来维护呢?这个系统一定会设置的非常复杂,Windows 就是这样干的所以有时候会有莫名其妙的错误。
2026-04-02 09:42:58
9957
43
原创 【Linux信号】Linux进程信号(下):可重入函数、Volatile关键字、SIGCHLD信号
volatile的字面意思是“易变的”。这个变量可能会在当前代码流之外被修改(例如:由信号处理函数、多线程、或者硬件中断修改)。因此,编译器在编译时严禁对该变量进行任何“假定不变”的优化,每次使用它时必须老老实实地去内存地址中读取。下面我们演示如何使用gcc -S命令来查看开启优化后,有无volatile关键字在生成的真实汇编代码上的具体差异。我们直接通过对比真实的汇编逻辑来看一下volatile是如何“保命”的。// 或者去掉 volatilewhile (!flag);
2026-03-31 02:20:29
985
53
原创 【Linux信号】Linux进程信号:概念补充
在 Linux 的多任务世界里,进程并不是孤立运行的。它们需要一种机制来应对突发事件——比如用户按下了Ctrl + C,或者程序不小心除以了 0。这种“异步通信”的机制就是信号(Signal。最近通过对 Linux 进程信号的学习,我发现它不仅是系统编程的基石,更像是一套完整的“紧急应变系统”。今天这篇博客,我将带大家从信号的产生、保存、处理到内核底层原理进行全方位的深度拆解。通过本次学习,我深刻体会到信号是 Linux 异步处理机制的灵魂:产生:来源多样(按键、软件、硬件)。保存:通过中的位图管理。
2026-03-30 19:09:40
572
31
原创 【Linux:文件】文件基础IO进阶
在普通用户眼中,文件是磁盘上的.txt或.mp4。狭义文件:存储在磁盘等永久性介质上的数据集合。广义文件:一切皆文件。键盘是文件(只读)、显示器是文件(只写)、网卡、磁盘、甚至进程间通信的管道都是文件。这种抽象极其强大:操作系统通过一套统一的接口(read/write)就能管理所有硬件,屏蔽了不同外设的物理差异。当你调用 open 时,内核会为进程创建一个 struct file 结构体来描述该文件。进程通过一个名为 file_struct 的结构体管理所有打开的文件,其内部包含一个数组(文件描述符表)
2026-03-28 17:45:25
8976
57
原创 【MYSQL】MYSQL学习的一大重点:表的约束
约束用于保证数据的合法性和业务逻辑的正确性,补充数据类型本身的限制。真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
2026-03-28 16:18:40
1020
37
原创 【Linux信号】Linux进程信号(中):信号保存、信号处理(含“OS是如何运行的?”)
sigset_t就是数据类型,后面的两个就是在用户栈上的两个变量(定义变量而已,没多高级,在用户栈上)!可能是随机值!我们要初始化!不退出就会继续打印继续处理。
2026-03-25 12:21:01
1200
30
原创 alarm系统调用的一次性原理揭秘
alarm 系统调用的一次性特性是其核心设计机制,该特性直接源于其作为软件定时器的实现原理与信号(SIGALRM)的发送规则。其本质在于,操作系统内核为每个进程维护一个独立的单次定时器,该定时器在触发并发送 SIGALRM 信号后即自动失效,不会自动重置或循环,除非进程显式地再次调用 alarm。
2026-03-23 15:15:21
961
36
原创 【Linux:文件 + 进程】理解IPC通信
🎬 艾莉丝的简介:System V IPC(进程间通信)资源由操作系统统一管理。内核通过 结构体作为所有 IPC 资源的"管理头",实现统一的管理标准。无论是消息队列、信号量还是共享内存,它们的管理结构体都以 开头。—— 在操作系统内部,是如何管理所有的IPC资源呢?操作系统是统一管理所有IPC资源的!——不管你是啥都是同一种方案。1.3 全局管理变量内核通过三个全局静态变量分别管理三类 IPC 资源:2 ~> 具体资源结构体2.1 消息队列结构 msgid _ ds2.2 信号量结构
2026-03-23 09:37:03
686
31
原创 【Linux信号】Linux进程信号(上):信号产生方式和闹钟
大抵有如下这些:上面这些所有的信号产生的几乎都是异步的。人能够识别对应的、甚至还没有发生的这些信号为什么能够识别这些信号?人是经过教育的,早就知道信号对应处理动作的对应关系。操作系统给目标进程发送信号,目标进程能不能识别呢?进程天然能够识别——进程和信号都是程序员写的代码(进程相当于我们人,已经被程序员教育过了,程序员设计好了)进程能够识别信号,并且已经知道怎么处理信号了。设别信号是内置的,进程能自己识别信号,是内核程序员写的内置特性。信号的处理方法,在信号产生之前就已经准备好了。
2026-03-21 15:45:57
1384
61
原创 System V IPC三剑客深度剖析
System V IPC(Inter-Process Communication)是 UNIX System V 引入的一组进程间通信机制,包含共享内存消息队列和信号量三大组件。与管道、FIFO 等基于文件描述符的通信方式不同,System V IPC 采用标识符(identifier)作为访问核心,通过键值(key)在进程间建立关联。共享内存:适用于实时数据处理多媒体处理高频交易等对性能要求极高的场景消息队列:适用于微服务架构事件驱动系统工作流引擎等需要解耦的场景信号量:适用于数据库连接池资源池管理。
2026-03-21 15:34:05
412
5
原创 【Linux:文件 + 进程】进程间通信进阶(2)
🎬 艾莉丝的简介:这个消息队列是系统层面的概念,不是组件级别的,和未来组件里的消息队列不是一个东西。所谓的消息队列,就是在操作系统里面维护一个队列结构。也会存在一个由用户设置的key值(A、B进程都能够看到),约定好的。双方通过往消息队列里面插入节点来进行通信。消息队列在内核中也要存在一个描述结构体。消息队列也有自己的结构体,看到自己的键值。消息队列和共享内存都是系统级的IPC。如果这个数据节点只有数据,操作系统怎么区分这是A的还是B的?必须保证这种数据块是有类型的数据块!我们需要的系统调用:在共享内
2026-03-19 12:18:16
1198
48
这是比特的C语言贪吃蛇课件的压缩包,可以用来学习数据结构以及通过做贪吃蛇这个项目巩固前面链表的学习
2025-09-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅