- 博客(58)
- 收藏
- 关注
原创 Reactor 模式:高并发网络编程的事件驱动利器
Reactor 模式通过 “事件驱动 + 多路复用” 的设计,完美解决了高并发场景下的 I/O 处理难题。其核心价值在于用单线程(或少量线程)高效管理海量连接,同时保持代码的解耦与可维护性。掌握 Reactor 模式,是进阶高性能网络编程的关键一步。
2025-09-25 18:36:16
825
原创 I/O 多路转接之 epoll:高并发服务器的性能利器
epoll是 Linux 下最强大的多路 I/O 复用技术,通过 “红黑树 + 就绪队列” 的设计,解决了selectpoll的性能瓶颈。在高并发场景下,epoll能高效处理海量连接,是构建高性能服务器的核心工具。如果需要兼容多平台,selectpoll仍是备选;但在 Linux 专属的高并发场景中,epoll几乎是唯一选择。
2025-09-25 16:08:45
918
原创 I/O 多路转接之 select:高效管理多连接的秘密武器
select是 I/O 多路转接的 “入门级” 实现,它解决了 “单线程同时监听多连接” 的问题,但也存在 “连接数受限”“效率随连接数下降” 等缺陷。在高并发场景下,通常会使用更高效的epoll(Linux)或kqueue(BSD),但理解select的工作原理,是掌握更复杂 I/O 多路转接技术的基础。
2025-09-25 15:59:13
829
原创 深入浅出五种 IO 模型与非阻塞 IO
阻塞 IO:最简单但最不灵活非阻塞 IO:可并行任务,但轮询耗 CPU信号驱动 IO:内核通知,但处理复杂IO 多路转接:同时监听多 IO,高性能场景首选异步 IO:全程无需参与,效率最高但实现复杂非阻塞 IO 是理解 “IO 优化” 的基础,通过fcntl可快速实现,但实际场景中更多与 IO 多路转接结合使用,以达到更高的效率。
2025-09-25 15:51:50
648
原创 数据链路层详解:从帧封装到以太网,搞定局域网通信的核心
承上:把网络层的 IP 数据报封装成帧,加上寻址和校验信息;启下:把帧转换成物理层的比特流,同时处理传输中的错误和冲突;关键能力:帧定界(封装成帧)、错误屏蔽(透明传输)、可靠性保障(差错检测)。对于学习者来说,理解数据链路层,就能搞懂 “为什么 IP 要分片”“TCP 的 MSS 怎么来的”“局域网里电脑怎么通信” 这些核心问题 —— 它是串联物理层、网络层、传输层的关键纽带,也是后续学习 TCP、HTTP 等协议的基础。
2025-09-24 11:06:55
286
原创 网络层详解:从 IP 地址到路由转发,搞定跨网络通信的核心
寻址:用 IP 地址标识设备的 “网络位置”,解决 “设备在哪” 的问题;转发:用路由器和路由表,解决 “数据怎么到目标网络” 的问题;分片:用 IP 数据报的标识、片偏移,解决 “大数据包超过 MTU” 的问题;辅助:用 ARP 找 MAC,用 ICMP 报告错误和查询状态,确保通信顺畅。理解网络层,就能搞懂 “为什么手机能访问全球的服务器”“IP 地址和 MAC 地址的区别”“子网掩码怎么用” 这些核心问题 —— 它也是你深入学习 TCP、HTTPS 等上层协议的基础。
2025-09-24 11:01:34
365
原创 一文读懂传输层:从端口号到 UDP 协议,手把手教你实战
端口号是一个16 位的整数(范围 0-65535),用于标识一台主机上的 “唯一应用程序”。每个需要网络通信的应用(比如浏览器、微信、服务器),都会占用一个或多个端口号。浏览器访问百度时,百度服务器的 HTTP 服务用80 端口;你用微信发消息时,微信客户端会被系统分配一个动态端口号(比如 56789)。端口号:传输层的 “门牌号”,用 16 位整数标识应用程序,五元组唯一确定一次通信,知名端口号是公共服务的固定端口;UDP 协议。
2025-09-24 10:54:44
962
原创 一文读懂 HTTP 协议:从概念到实战,看这篇就够了
HTTP 是什么:客户端与服务器的通信协议,无连接、无状态;URL 结构:从协议到片段标识符,特殊字符需要 urlencode;请求响应格式:4 部分组成,空行是关键分隔;方法与状态码:GET 获取、POST 提交,200 成功、404 找不到;Header 作用:Content-Type 定义数据类型,Cookie 解决无状态;HTTPS 安全:加密层 + 证书,防止数据泄露和篡改。
2025-09-24 10:46:17
903
原创 深入理解序列化:网络编程中的数据转换艺术
序列化是将内存中的数据结构(如整数、字符串、对象等)转换为可传输或可存储的格式(通常是字节流或字符串)的过程。反序列化则是其逆过程:将收到的字节流或字符串还原为原始的数据结构。举个生活中的例子:你要把一个家具从北京运到上海,需要先把它拆解(序列化)成零件,运输到目的地后再重新组装(反序列化)成原来的样子。使数据能在网络中传输使数据能存储到文件或数据库中使不同编程语言编写的程序能互相通信创建// 声明使用proto3语法(默认是proto2)// 定义消息类型(类似C++的结构体)
2025-09-24 10:35:14
876
原创 从零到一:TCP 回声服务器与客户端的完整实现与原理详解
本文通过一个完整的 TCP 回声程序,展示了网络编程的核心流程:从socket创建、bind绑定、listen监听,到accept接收连接、readwrite收发数据,再到多进程并发处理。这些基础操作是理解 HTTP 服务器、RPC 框架等复杂网络应用的基石。通过亲手调试代码,你可以直观感受 TCP 的 "三次握手" 和 "四次挥手" 过程,理解可靠传输的底层逻辑。下一步,不妨尝试扩展功能,逐步深入网络编程的世界!
2025-08-13 22:17:21
981
原创 TCP Socket 编程实战:实现简易英译汉服务
TCP(传输控制协议)是一种面向连接、可靠的流式传输协议,与 UDP 的无连接特性不同,它通过三次握手建立连接、四次挥手断开连接,提供数据确认、重传机制,保证数据有序且完整传输。本文将基于 TCP Socket 编程,实现一个支持多客户端连接的英译汉服务,并详细解析 TCP 核心 API 及不同并发处理方案。本文通过实现一个英译汉服务,详细讲解了 TCP Socket 编程的核心流程与 API,并对比了单连接、多进程、多线程、线程池四种处理方案的优缺点。
2025-08-13 18:54:21
802
原创 使用 UDP 套接字实现客户端 - 服务器通信:完整指南
本文介绍了使用 UDP 套接字实现客户端 - 服务器通信的基本流程,并提供了完整的 C++代码实现。UDP 虽然不提供可靠性保证,但在对实时性要求高的场景中非常有用。
2025-08-13 13:06:05
690
原创 并发编程核心概念:从线程安全到死锁预防
原子性是并发操作的基本保证线程安全确保多线程环境下的数据一致性可重入函数是编写可靠并发代码的基础线程池能高效管理线程资源,提升性能死锁是并发编程的 "陷阱",需要通过合理设计来避免。
2025-08-12 14:30:29
742
原创 Socket 编程预备
端口号(port)是传输层协议的内容• 端口号是一个2字节16位的整数;• 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来 处理;• IP地址+端口号能够标识网络上的某一台主机的某一个进程;• 一个端口号只能被一个进程占用.0-1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的 端口号都是固定的.1024-65535:操作系统动态分配的端口号.客户端程序的端口号,就是由操作 系统从这个范围分配的.C++ socket n. (电源)插座;
2025-08-07 21:02:07
341
原创 linux线程基础概念
本篇主要讲解线程相关知识和概念、线程的相关函数使用、二级页表的讲解。之前我们学过进程,而什么是线程呢??是LWP(轻量级进程),是内核级线程,由操作系统直接管理和调度。1、在一个程序里的一个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的控制序列”2、一切进程都至少有一个执行线程3、线程在进程内部运行,本质是在进程地址空间内运行4、在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。
2025-06-08 12:51:59
999
原创 linux信号详解
pending 位图:用于记录当前进程收到的所有信号,每一位对应一个信号,若该位为 1,表示进程收到了相应的信号。block 位图:用于记录当前被阻塞的信号,被阻塞的信号不会立即被处理,而是处于挂起状态,直到该信号的阻塞被解除。handler 位图:记录了每个信号对应的处理方式(默认、忽略、自定义处理函数)。信号处理是进程对收到的信号做出响应的过程。当进程收到一个信号时,系统会根据信号的处理方式进行相应的操作。如果是默认处理,系统会按照预定义的行为处理信号;如果是忽略信号,系统会直接丢弃该信号;
2025-06-02 21:23:10
1702
原创 linux 进程间通信_共享内存
共享内存(Shared Memory)是一种高效的,允许多个进程直接访问同一块物理内存区域,实现数据的快速交换。它是IPC中速度最快的方式,因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则需要将数据通过中间机制进行转换。共享内存的原理如上图所示,主要分为两部1.进程在物理内存上开辟一块空间,这块空间称为共享内存。2.不同进程将这块空间挂接到自己的进程地址空间中。3.进程通过虚拟地址和页表的映射找到共享内存,然后对共享内存进行读写数据。
2025-05-26 12:05:25
501
原创 Linux 动静态库详解
预处理:完成头文件展开、去注释、宏替换、条件编译等,最终形成xxx.i文件。编译: 完成词法分析、语法分析、语义分析、符号汇总等,检查无误后将代码翻译成汇编指令,最终形成xxx.s文件。汇编: 将汇编指令转换成二进制指令,最终形成xxx.o文件。链接: 将生成的各个xxx.o文件进行链接,最终形成可执行程序。静态库:在编译时,库的代码被直接复制到可执行文件中,程序运行时不依赖外部库文件。动态库:在程序运行时加载库的代码,多个程序共享同一份库的实现,节省内存和磁盘空间。
2025-05-14 11:08:22
1149
原创 Linux 软硬连接详解
定义:软链接是一个独立的文件,拥有自己的 inode 和属性,其内容存储目标文件/目录的路径字符串,类似于 Windows 的快捷方式。特性。
2025-05-12 18:45:12
836
原创 Linux 详解inode
是Linux文件系统中的一种数据结构,用于存储文件或目录的元数据(metadata)。每个文件或目录在文件系统中都有一个唯一的inode编号,它记录了文件的关键信息,但不包含文件名或文件内容本身。
2025-05-12 18:11:02
706
原创 Linux_进程退出与进程等待
tatus不能简单的当作整型来看,要从二进制的角度来看,32位下,整型转化为二进制有32个bit位,但是我们仅关注低16位。是用于接收子进程终止状态的关键参数,需配合特定宏解析具体信息。父进程在忙,子进程结束了,但无人回收,这样就造成了“死亡”的子进程一直占用资源。为了解决这个问题,最初的思路是:让父进程停下,等待子进程执行完,然后回。_exit :立即终止进程,不执行任何清理操作。若父进程不关心子进程状态,可将参数设为。,此时仅等待子进程结束而不获取状态信息。这个时候的子进程被称为“僵尸进程”
2025-05-08 22:24:15
1350
原创 Linux 进程替换
原理:进程替换是指通过调用特定的系统调用(如exec系列函数),将一个进程当前执行的程序完全替换为新的程序映像。替换后,原进程的代码段、数据段、堆栈等内存空间被新程序覆盖,但进程的 PID、文件描述符等资源保持不变13。替换成功后,原进程的后续代码不再执行,仅保留新程序的执行入口。
2025-05-08 19:11:53
281
原创 linux_进程地址空间(虚拟地址空间)
先看这样一个具体的例子我们发现在同一个地址空间的a变量,父进程和子进程访问时获取的值却不是相同的,这是什么原因呢?首先,我们可以理解,父子进程的值不同是因为进程间具有独立性,但是这里的i的地址居然是相同的。因此,我们可以先排除该地址是变量i在物理磁盘上的地址的可能性(因为物理磁盘的同一个地址,只能存放唯一确定的一个值)。因此,这个地址只能是虚拟地址(也称为线性地址在Linux中,有时候我们也将这种地址称为逻辑地址。操作系统为每个进程都创建了,这样每个进程都能独立的运行。
2025-05-07 21:02:58
890
原创 unordered_map、unordered_set详解
何时选择?通过合理选择容器,可以显著提升程序性能。对于大多数高频操作场景,和凭借其哈希表的高效性,成为C++开发者的首选工具。负载因子(Load Factor):桶中元素平均数量,影响冲突概率。// 设置最大负载因子// 预分配桶数量。
2025-04-20 22:34:01
726
原创 红黑树总结
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍(最长路径也不会超出最短路径的两倍,因此红黑树的平衡性要求相对宽松,没有AVL树那样严格),从而使搜索树达到一种相对平衡的状态。红黑树(Red-Black Tree)也是是一种自平衡的二叉搜索树,与AVL树不同的是它在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。任意结点到其每个叶子结点的简单路径上,黑色节点的数量相同:确保了树的黑平衡性,即红黑树中每条路径上黑色结点的数量一致。
2025-04-20 12:34:12
334
原创 C++11新增特性—>可变参数模板、lambda表达式、包装器
1、【概念】可变参数模板是C++11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板,这里主要针对函数模板的可变参数。在C++11之前,类模板和函数模板中只能包含固定数量的模板参数,可变模板参数无疑是一个巨大的改进,但由于可变参数模板比较抽象,因此使用起来需要一定的技巧。在C++11之前其实也有可变参数的概念,比如printf函数就能够接收任意多个参数,但这是函数参数的可变参数,并不是模板的可变参数。
2025-04-05 14:37:04
618
原创 左值引用与右值引用详解
左值是一个表示数据的,比如:变量名、解引用的指针变量。一般地,我们可以获取它的地址和对它赋值,定义时const修饰符后的左 值,不能给他赋值,但是可以取它的地址。总体而言,可以取地址的对象就是左值。
2025-02-27 20:55:17
1512
原创 AVL树详解
AVL树,又称为平衡二叉树,它基于二叉搜索树并通过平衡而得到。在数据结构中,二叉搜索树可以提高搜索数据的效率,但在数据有序的情况下会退化为单支树,此时在树中查找元素就得遍历一整个分支,时间复杂度也会退化至O(N)。AVL树的左右子树高度差不能超过1,也就是说每个节点的平衡因子的绝对值不能超过1;, _bf(0){}//节点的父节点T _data;//节点的值int _bf;// 节点的平衡因子。
2025-02-19 13:42:41
901
原创 c++ map和set功能详解
1. set是按照一定次序存储元素的容器。2. 在 set 中,元素的 value 也标识它 (value 就是 key ,类型为 T) ,并且每个 value 必须是唯一的。set中的元素不能在容器中修改( 元素总是 const) ,但是可以从容器中插入或删除它们。3.在内部, set 中的元素总是按照其内部比较对象 ( 类型比较 ) 所指示的特定严格弱排序准则进行 排序。
2025-02-17 14:02:41
899
原创 二叉搜索树
/分装每一个节点,定义成模板函数K _key;{}//搜素树的定义public:private:在BSTree类种主要实现四个函数:插入,删除,查找,中序遍历。(中序遍历搜索二叉树时得到的是有序的)下面为二叉树的代码实现,只有看了代码实现,才会对二叉树有了更深刻的认识创建一个二叉搜索树的过程,也就是不断的插入。插入的具体过程如下:1、树为空,则直接新增节点,赋值给root指针2、树不空,按二叉搜索树性质查找插入位置,插入新节点//如果树为空的情况。
2025-02-13 12:42:09
881
原创 C++多态详解
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。基类的虚函数进行重写在继承中要构成多态还有两个条件(二者缺一不可):1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:virtual void BuyTicket() { cout << "买票-全价" << endl;
2025-02-11 18:38:58
819
原创 C++继承
1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。
2025-02-09 19:52:30
690
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅