- 博客(148)
- 收藏
- 关注
原创 【数据结构】树和二叉树(下):讲透四种遍历、递归返回值与经典题
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-08 10:44:48
182
2
原创 【数据结构】树和二叉树(上):从层次关系到性质推导,把存储结构讲透
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-08 10:39:30
190
1
原创 Linux 网络编程(13·下):ET 为什么要读到 EAGAIN?写出能正确收发的 epoll 服务器
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-07 12:28:52
353
19
原创 Linux 网络编程(13·上):从 poll 到 epoll,读懂三大接口、就绪队列与 LT 模式
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-07 12:24:22
450
14
原创 【Linux 网络编程】Reactor 反应堆模式(下):多 Reactor、One Thread One Loop 与 eventfd 唤醒
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-05 11:18:04
425
15
原创 【Linux 网络编程】Reactor 反应堆模式(上):把 epoll 写成真正的事件驱动服务器
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-05 11:10:38
541
11
原创 【数据结构与算法】时间复杂度与空间复杂度:从循环、递归到两道实战题,一篇真正算明白
数组问题中,n通常指元素个数;字符串问题中,可能指字符数;矩阵问题则可能同时有行数m和列数n。不要把所有参数都自动压成一个n。如果程序分别扫描两个长度互相独立的数组,保留O(n + m)才能清楚地表达成本。只有题目给出m = nm ≤ n之类的关系时,才有依据进一步化简。还有一个容易被忽略的区别:数值参数和输入长度不一定相同。例如,循环从 1 数到整数x,按数值x来衡量是线性;若问题关注输入的二进制位数b,则x可达到约2^b。分析之前,必须先把自变量说清楚。二分查找的前提是数组已经按非递减顺序排列。
2026-11-04 10:55:22
428
11
原创 【数据结构】顺序表从入门到实现:讲透动态扩容、增删查改与双指针
define N100使用这段定义前需要包含<stddef.h>,其中提供了size_t。这里的N决定可容纳多少元素,size记录实际使用了多少个位置。即使数组有 100 格,也可以暂时只保存 3 个元素。定长数组并非没有价值。如果数据规模上限很小、可以提前确定,或者希望避免运行中分配内存,固定容量会让行为更容易预测。它的限制也很明确:满了以后必须拒绝插入,不能指望数组自动变长。设操作前有n个元素。给定合法下标,插入位置为pos时,需要移动n - pos个旧元素;删除位置为pos时,需要移动。
2026-11-04 10:50:46
401
8
原创 【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
读完hello后,另一端还可以继续发送,所以此时返回暂不可读。只有在另一端结束发送、并且已有数据已经读尽后,接收端才观察到 EOF。空缓冲区是暂时状态,流的结束是方向状态。把这两者区分开,才不会在连接暂时安静时误删连接,也不会在连接已经结束后继续无意义地读。现在是在等数据,还是在取数据?通知的是就绪,还是某次操作完成?这次返回值到底表示哪一种状态?阻塞读取把等待放在调用中;非阻塞读取让应用在暂时做不了时先拿回控制权;多路复用集中等待多个描述符;信号驱动把就绪信息送给应用;
2026-11-03 09:50:49
486
16
原创 【Linux 网络编程】多路转接 select:从 fd_set 位图到多客户端字典服务器,一篇理清事件循环
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-03 09:38:51
472
11
原创 【Linux 网络编程】从 select 到 poll:一步步改写 TCP 服务器,把事件与连接管理讲透
从 select 改到 poll,最关键的收获不是少写几个宏,而是开始用明确的状态来管理每个连接:它现在保存在哪个槽位,关心哪些事件,还剩多少字节没发送,读侧是否结束,什么时候应该回收。沿着这条线再去阅读 epoll 和 Reactor,很多看起来复杂的结构就会有来由:事件检测负责告诉我们谁值得处理,连接对象负责保存进度,业务代码负责解释数据。把这三件事分清,服务器代码才会越来越容易理解,也越来越容易验证。如果你正在练习这个版本,建议先让回显和半关闭测试稳定通过,再加入协议解析与定时任务。
2026-11-02 10:14:51
417
13
原创 【Linux 网络编程】NAT、代理服务与内网穿透:从一个公网 IP,到一条真正可达的连接
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-11-02 10:10:29
1077
7
原创 【Linux 网络编程】DNS 与 ICMP:从域名解析到 ping、traceroute,把“网络通不通”问清楚
DNS 让名字与网络资源建立联系,ICMP 让部分网络状态有机会被看见。真正排查问题时,我们需要的不是一条万能命令,而是把每次观测放回它对应的层次。看到一个 DNS 结果,先问“谁回答的、什么类型、缓存多久”;看到一次 ping 回复,先问“哪个地址、哪个方向、证明了哪一次往返”;看到一份 traceroute,先问“用了什么探测、哪些节点回应、星号还有哪些解释”。当这些问题能被分别回答,“网络通不通”就不再是一个模糊判断,而会变成一条可以逐步验证的分析路径。
2026-10-31 16:08:59
491
12
原创 【Linux 网络编程】手动部署 frp 内网穿透:从 SSH 远程登录到 Nginx 外网访问
在 L 上查看实际配置的访问日志。再从 V 发起一次请求,查看相同时间附近是否出现/frp-lab/。如果配置修改过日志位置,以nginx -T显示的路径为准。这里还有一个值得观察的细节:普通 TCP 转发下,Nginx 看到的连接来源往往是 frpc 的本地连接地址,而不是 V 的真实公网 IP。frp 不会因为转发了 HTTP,就自动给这条 TCP 代理增加可被 Nginx 正确识别的真实来源信息。
2026-10-31 16:00:56
452
10
原创 【Linux 网络编程】ARP 的具体过程与 ARP 欺骗:一条 IP → MAC 映射,怎样改变数据的去向?
ARP 把一个看起来抽象的“下一跳 IP”,落实成网卡真正能够使用的链路层地址。正常时,它完成广播询问、应答学习和后续封装;错误绑定被接受时,同一套发送逻辑又可能把数据交给错误的设备。当前问的是谁,谁声称自己代表它,系统最终采用了哪条映射,这一帧因此交到了哪里。把路由、邻居表、以太网封装和转发条件放在一起,既能解释正常通信,也能更准确地定位异常。愿我们不只记住“ARP 请求广播、应答单播”,还能在真正看到一份报文时,把它每一个地址字段的来由讲清楚。
2026-10-30 12:24:39
433
13
原创 【Linux 网络编程】IP 分片与重组:3000 字节的数据报,怎样拆开又拼回来?
本片之后,原始数据报是否还有载荷?B 原本就不是整份数据报的末片,后面还有 C 的 20 字节。于是 B1、B2、B3 都应该是 MF=1。不能因为 B3 是“B 拆出来的最后一个”,就把它设为 MF=0。新片原始载荷区间载荷IP 总长OffsetMFB16006201851B26006202601B32803003351概括二次分片的 MF 规则:前面的新片置 1,最后一个新片继承旧片的 MF。只有原始数据报的真正末尾,才可能得到 MF=0。
2026-10-30 12:16:08
771
15
原创 【Linux 网络编程】数据链路层:从以太网帧、MTU 到 ARP,把“下一跳”真正送出去
理解数据链路层,不是背住 MAC 有 6 字节、MTU 常见 1500 就结束了。更有用的能力,是看到一份数据时能准确说出:它属于哪一层,当前交给谁,长度从哪里算起,以及哪些字段负责让下一层继续处理。从网络层往下看,路由给出的是下一步方向;从链路层往上看,ARP、帧封装和接口传输把这个方向变成实际交付。两者接起来,抽象的“数据已经发出”才有了可以观察和核对的细节。后续再研究 ARP 异常、NAT、代理和内网通信时,也可以沿着这条线继续分析:先找到实际路径,再检查当前这一跳,不把不同层次的问题混在一起。
2026-10-29 13:35:16
426
8
原创 【Linux 网络编程】网络层:从 IPv4 首部、子网划分到路由表,走通一个数据包的旅程
理解网络层的关键,是始终区分“最终目的”和“当前下一跳”。前者写在 IP 报文里,后者由本次选路决定;把二者接起来的,是出口接口和当前链路的交付机制。下一次看见connect超时,或者发现“同一段 IP 却无法通信”,可以先算前缀、查实际路由,再观察下一跳。这样排查的每一步都有依据,首部、掩码和路由表也就真正连成了一套知识。接下来学习数据链路层和 ARP 时,还可以带着一个问题继续往下走:路由已经选好了,链路上的节点究竟怎样找到彼此,并把这一帧交出去?我们下一篇见。
2026-10-29 13:32:04
559
10
原创 【Linux 网络编程】TCP 全连接队列与 tcpdump 抓包:从 backlog 实验到握手、挥手与 close 排错
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-10-28 10:37:31
400
5
原创 【Linux 网络编程】传输层协议 TCP(下):滑动窗口、拥塞控制与字节流分帧
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-10-28 10:34:25
401
5
原创 【Linux 网络编程】传输层协议 TCP(上):从序号、确认与重传,到三次握手和四次挥手
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-10-27 11:18:40
416
3
原创 【Linux 网络编程】应用层协议 HTTP(下):Header、连接管理与 C++ HTTP 服务器
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-10-27 11:08:00
470
6
原创 【C语言项目实战】贪吃蛇(下):移动、碰撞与计分,完成一局可玩的游戏
没吃食物:头插新节点、删掉旧尾;吃到食物:只头插、不删尾。按键决定方向和速度,定时器决定什么时候移动;新蛇头坐标先通过边界、自撞与食物判定,再写入链表;普通移动允许进入本步会离开的旧蛇尾格;暂停和调速类按键应以“按下边沿”触发;每个动态节点都必须在离开蛇身或本局结束时释放;画面由数据状态驱动,移动时只更新变化的格子。学完这两篇,获得的不只是一个小游戏:你已经把结构体、枚举、动态内存、链表、函数拆分、控制台 API 和边界测试串成了一个可以运行、可以解释、也可以继续改造的小工程。
2026-10-26 11:14:20
752
13
原创 【C语言项目实战】贪吃蛇(上):从控制台坐标到链表建模,把游戏真正搭起来
用GameStartGameRunGameEnd管理整局生命周期;区分控制台字符列与游戏逻辑格,横向移动必须遵守两列一步;用COORD和定位,用 Win32 宽字符输出绘图;用单链表保存蛇身,蛇头是链表头,蛇尾是最后一个节点;初始化食物时排除蛇身,棋盘满时明确宣布获胜;在开始移动前,先检查句柄、坐标、内存与状态是否完整。下一篇,我们将进入最关键的一步:把新蛇头接到链表上,决定何时删除蛇尾,并处理吃食物、自撞、撞墙、暂停、调速和重开。下一篇:贪吃蛇(下)——游戏循环与完整可运行工程。
2026-10-26 11:11:09
1251
18
原创 【Linux 网络编程】应用层协议 HTTP(上):URL、请求与响应、方法和状态码
🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。
2026-10-24 11:53:32
557
15
原创 【Linux 网络编程】HTTP Cookie 与 Session(下):用 C++ 串起登录、身份识别与注销
从报文看,浏览器依然只是发送;从应用看,服务端已经多了一套明确的状态管理:认证后创建记录,收到标识后查询,过期时拒绝,重新登录时轮换,注销时撤销。真正需要记住的是这条判断链:有 Cookie 不代表有 sid,有 sid 不代表表中有记录,查到记录也要检查是否仍有效。身份必须在服务端验证之后才能交给后续业务。把这一链条和上篇的保存、范围、期限规则连在一起,Cookie 与 Session 就不再只是两个位置不同的名词,而是一套能用代码和请求观察的登录会话机制。
2026-10-24 11:50:13
527
6
原创 【Linux 网络编程】HTTP Cookie 与 Session(上):浏览器如何记住你?从报文到作用范围实验
Cookie 的过程可以沿着请求追下来:服务器用 Set-Cookie 设置数据和属性,客户端按规则保存,之后用 Cookie 回传匹配的名字和值。Domain、Path、期限和安全属性,共同决定某次请求是否带上它。真正掌握它,不只是会加一行响应头,还要解释为什么换了 TCP 连接仍能回传、为什么/a/b匹配而/a/bc不匹配、为什么反复设置会延后到期,以及为什么客户端声称的用户名不能直接成为认证结果。下一篇继续连接服务端会话表,让“浏览器保存一份数据”变成“服务端验证一次有效会话”。
2026-10-23 12:13:33
432
11
原创 【Linux 网络编程】传输层协议 UDP:从 8 字节首部到消息边界、缓冲区与 MTU
UDP 用很小的首部保留了消息边界,也把大量交付策略留给上层。理解这一点之后,端口、截断、队列与 MTU 就能放在同一条收发路径中解释。接下来学习 TCP 时,可以继续带着这些问题比较:它怎样确认数据,怎样重传,怎样保证顺序,又为什么提供的是字节流。把两种协议承担的责任对照起来,往往比单独背一张特点表更容易记住。我们下一篇见。
2026-10-23 12:09:56
363
6
原创 【Linux 网络编程】HTTPS 协议原理:从对称加密、中间人攻击到证书与 TLS 握手
密码学哈希函数把任意长度的输入映射成定长摘要。例如 SHA-256 的结果是 256 位,也就是 32 字节;显示成十六进制时占 64 个字符。输入只改了一个字节,摘要通常就会有明显变化。哈希没有对应的“解密函数”,但这也不意味着摘要能阻止猜测:如果输入候选很少,攻击者可以把候选逐个计算后比较。另一个边界是碰撞。输入空间大于输出空间,理论上必然存在不同输入得到相同摘要的情况。现代密码学哈希追求的是让攻击者难以有效找到这样的碰撞,而不是证明世界上绝无碰撞。
2026-10-22 13:46:53
599
5
原创 【Linux 网络编程】进程间关系与守护进程:从作业控制到双重 fork
理解守护进程的关键,是把几种关系接起来:PID 与 PPID 描述进程身份和父子关系,PGID 把进程组织成组,SID 把进程组组织成会话,终端再通过前台进程组参与信号与作业控制。从这里再看代码,顺序就自然了:第一次fork让后续分支不再是原组长,setsid建立新会话,第二次fork让最终进程不再是会话首进程,随后安排工作目录、权限掩码、标准流与日志。每一步解决不同问题,也都应该检查自己的执行结果。真正让服务容易维护的,还包括清楚的失败记录、可控的退出方式、可靠的就绪通知,以及合适的服务管理器。
2026-10-22 13:38:35
592
4
原创 【Linux 网络编程】手写序列化与反序列化:从 x op y 到能校验的文本协议
PDF 使用选择手写分支,否则走 JSON 分支。它是编译时选择,一份生成的程序不会因为收到不同正文就自动切换分支。0# define SelfDefine 0 # ifdef SelfDefine // 仍然会进入这里,因为宏已定义;值为 0 不改变 #ifdef 的判断。# endif需要根据数值选择时可以用,并明确默认配置。若同一个头文件在不同编译单元用不同宏配置产生了不同定义,还会带来定义不一致的问题,不能只保证“每个源文件单独能编译”。
2026-10-21 13:33:36
461
原创 【Linux 网络编程】应用层自定义协议与序列化(下):JsonCpp、严格反序列化与网络计算器
字段JSON 类型本文约束datax整数32 位有符号整数范围datay整数32 位有符号整数范围oper字符串长度恰为一个 ASCII 字节在结构校验中,oper可以是一个单字节但不支持的符号,例如。这种情况由业务返回“不支持运算符”,与oper缺失、写成数字或写成多字节字符串分开。本版要求请求恰有三个字段。额外字段会被拒绝,这是一种明确但比较严格的策略。后续若希望增加版本或请求编号,必须一起修改协议规则与两端实现。JSON 负责表达结构化正文,JsonCpp 帮助 C++ 程序读写这种格式。
2026-10-21 13:21:57
371
2
原创 【Linux 网络编程】应用层自定义协议与序列化(上):TCP 字节流、消息边界与增量拆包
自定义计算器协议,并不意味着必须亲手设计整数编码、字符串转义和对象格式。我们可以用 JSON 表达正文,同时自行约定字段名、允许值和外层帧格式。这里同时存在两层约定:JSON 解决通用数据表达;计算器协议解决业务字段与通信行为。它们可以组合使用,没有“用了 JSON 就没有自定义协议”这样的限制。应用层协议把字节赋予业务意义。对 TCP 来说,接收程序还必须自行识别消息边界:系统调用返回的一段字节,未必就是一条完整请求。
2026-10-20 10:44:37
272
8
原创 【Linux 网络编程】connect 的断线重连:用状态机写一个能恢复连接的 TCP 客户端
NEW触发一次首次尝试;首次失败后,最多追加 5 次尝试;每次追加尝试前等待 1 秒;某次成功就立即回到通信;第 5 次仍失败,直接进入CLOSED。因此首次启动时,最多执行1 + 5 = 6 次connect。已经连接后再次断开,会获得一轮新的、最多 5 次的恢复预算。不要把“最多重试五次”含糊地写成“总共只尝试五次”,否则代码与日志很容易对不上。NEW:进行一次首次连接→ 成功:CONNECTED,收发完整应用消息→ 失败或通信中断:释放旧 fd,进入 DISCONNECTED。
2026-10-20 10:40:10
302
8
原创 【Linux 网络编程】TCP 跨平台实战:用 Windows 客户端访问 Linux 服务器
Windows 访问 Linux 的 TCP 实验,把两类问题放在了一起:一类是平台接口的差异,另一类是双方通信约定是否一致。平台差异体现在初始化、句柄类型、链接库、错误码和资源释放上。客户端使用 Winsock,服务器使用 Linux Socket,只要双方采用一致的 TCP 与应用约定,就能交换同一串字节。TCP 收发的关键则是返回值与完成规则。send要检查发送进度,recv要区分数据、EOF 和错误;一次调用不等于一条完整业务消息。
2026-10-19 11:21:40
791
原创 【Linux 网络编程】TCP Socket 编程(下):多进程、多线程、远程命令与线程池
从串行回显到并发服务器,最核心的变化是把连接交给合适的执行者,同时明确资源责任。多进程依赖fork,要分别关闭父子进程不需要的描述符,并回收结束的子进程;多线程共享进程资源,要让参数对象活到工作结束,成功移交后不再由主线程重复关闭;业务层处理回显、命令或翻译,网络层继续保证完整请求与完整响应;线程池复用固定工作线程,连接队列必须有界,网络 IO 应在队列锁外执行;连接级阻塞任务会占用工作线程,空闲长连接让我们看见非阻塞 IO 与多路复用的必要性。
2026-10-19 11:15:02
377
1
原创 【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
socket创建通信资源,bind确定本地入口,listen建立被动监听角色;accept返回连接描述符,监听描述符继续承担接收新连接的职责;客户端通过connect指定远端,成功后继续使用原来的 Socket;TCP 交付有序字节流,应用自己决定一条消息在哪里结束;收发按实际返回值推进,资源按明确的所有权释放;串行服务器的问题来自执行流程,需要通过并发模型继续改善。
2026-10-18 11:10:55
272
2
原创 【C 语言数据结构】双向链表专题:哨兵位、双向循环、增删查改与完整源码
哨兵不保存有效数据,空表时;首节点是head->next,尾节点是head->prev;遍历在再次遇到哨兵时结束,不依赖NULL;插入要保存原后继并接好四条链接;删除有效节点要重连前驱和后继,再释放节点;头尾插删可以复用指定位置插删,且哨兵地址保持稳定;销毁要先保存后继,释放所有数据节点和哨兵,再把调用者指针置空;所谓O(1)的任意位置增删,以已持有有效节点指针为前提。不管从前往后走,还是从后往前走,都能按预期回到哨兵;每次局部改链完成后,这个事实必须仍然成立。
2026-10-18 11:02:30
345
1
原创 【数据结构】单链表的应用:6 道经典 OJ 题与通讯录项目实战
当其中一条链表走完时,另一条链表剩余部分仍然有序,而且其第一个值不小于已合并部分的尾值。因此不必再逐个处理,一次连接剩余链即可。对长度为 6 的链表,中间位置有第 3 和第 4 个节点。上述初始化和循环条件会让slow停在第 4 个节点,也就是后一个中点。这与常见 OJ 题目的要求一致。如果题目要求返回前一个中点,就需要改变初始位置或循环条件,不能把“快慢指针”当成唯一固定模板。PDF 示例将联系人结构作为链表的数据域。为了给字符串结尾的\0641616128int age;
2026-10-18 10:50:18
298
4
原创 【C 语言数据结构】单链表从入门到实现:节点、二级指针、增删查改与完整源码
pphead单链表的表面只有一个data和一个next单链表在逻辑上连续,节点在物理内存中不必连续;头指针保存第一个有效节点地址,尾节点的next为NULL;遍历只能从头沿next前进,不支持顺序表式的随机访问;可能修改调用者头指针的函数,应接收SLTNode**;头插要先保存旧头关系,再更新头指针;无尾指针时,尾插和尾删都需要线性遍历;已知pos后的操作可以是O(1),但寻找pos或前驱仍可能是O(n);删除节点要先保存仍需使用的地址,再断链和释放;销毁链表时必须在。
2026-10-18 10:47:11
327
9
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅