自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】四十八.《Linux :IO 多路复用,poll 与 epoll 原理、代码实战与惊群问题解析》---详解

命令,查看当前epoll服务器的文件描述符的使用情况。文件描述符 0、1、2 是默认打开的,分别对应的是标准输入、标准输出和标准错误,3 号文件描述符对应的是监听套接字,4 号文件描述符对应 epoll 句柄,5 号和 6 号文件描述符分别对应访问服务器的两个客户端。在这里阻塞是非常严重的,就比如博客写的服务器都是单进程的服务器,若 recv 被阻塞住,并且此后该数据再也不就绪,那么就相当于服务器挂掉了,因此在 ET 工作模式下循环调用 recv 函数进行读取时,必须将对应的文件描述符设置为非阻塞状态。

2026-10-04 10:35:33 859 15

原创 【C++标准项目】发布订阅式消息队列(篇三):C++ 第三方库实战:基于 muduo 库函数实现 protobuf 协议的通信

- 语法版本(必须在第一行)<- 命名空间└── 四个 message} 1 字段} 1 字段2 字段} 1 字段声明使用 protobuf3 版本语法,proto3 默认值规则简化,不需要required/optional修饰。命名空间 bit,protoc 编译生成 C++ 代码后,所有消息类都放在 bit:: 命名空间下,防止类名冲突。C++ 里使用:bit::TranslateRequest req;客户端发给服务端的翻译请求消息。

2026-10-03 16:07:11 360 10

原创 【C++标准项目】发布订阅式消息队列(篇二):C++ 第三方库实战:Protobuf 与 Muduo 从原理到上手

消息(message)就是我们要传输的结构化对象。在网络里,双方必须先"定制协议"——说白了就是约定结构体长什么样;PB 用message来承载这件事,并据此帮你生成类和方法。message 消息类型名 {命名规范:驼峰命名,首字母大写。// 定义联系人消息字段类型 字段名 = 字段唯一编号;字段名:全小写,多个单词用连接(snake_case字段类型:分为标量数据类型(int32 / string …)和特殊类型(枚举、其他 message 等);字段唯一编号:用来标识字段,

2026-10-02 23:12:30 458 16

原创 【C++标准项目】C++基于protobuf的发布订阅式消息队列(篇一):项目概述+环境搭建

代码块。

2026-10-02 01:37:54 537 23

原创 【Redis初阶】(篇二)《一文吃透 Redis:特性、应用场景、版本演进与安装配置全解析》

假如现在有人问 Redis 的作者都有谁在使用 Redis,我想他可以开句玩笑的回答:还有谁不使用 Redis,当然这只是开玩笑,但是从 Redis 的官方公司统计来看,有很多重量级的公司都在使用 Redis,如国外的 Twitter、Instagram、Stack Overflow、Github 等,国内就更多了,如果单单从体量来统计,新浪微博可以说是全球最大的 Redis 使用者,除了新浪微博,还有像阿里巴巴、腾讯、搜狐、优酷土豆、美团、小米、唯品会等公司都是 Redis 的使用者。

2026-09-29 15:12:24 420 12

原创 【Redis】《一文走完服务端高并发架构演进:从单机架构到 K8S 容器编排》

应用服务和数据库服务共用一台服务器。

2026-09-29 13:57:57 358 11

原创 【Linux网络编程】四十七.《Linux IO 模型详解:阻塞 IO、非阻塞 IO 与 IO 多路转接(select)》

因此在以非阻塞方式读取数据时,如果调用 read 函数时得到的返回值是 -1,此时还需通过错误码进一步进行判断,如果错误码的值是 EAGAIN 或 EWOULDBLOCK,说明本次调用 read 函数出错是因为底层数据还没有就绪,因此后续还应该继续调用 read 函数进行轮询检测数据是否就绪,当数据继续时再进行数据的读取。为方便举例,假设 fd_set 占用 1 字节,fd_set 里的每一个比特位对应一个文件描述符 fd,那么 1 字节长度的 fd_set 最多可以管理 8 个 fd。

2026-09-28 21:27:11 765 13

原创 【Redis初阶】(篇一)《小白也能轻松上手,用ubuntu22.04搭建redis环境》---详解

初学者建议安装 Redis 5.0 或更高稳定版本(如 Redis 6/7)。Redis 官方仅支持 Linux 环境。建议在 Linux 虚拟机(CentOS 或 Ubuntu)上。这有助于理解 Redis 的目录结构、配置文件位置及启动流程。当学习到或时,建议切换到环境。利用 Docker 可以快速模拟多节点环境,避免繁琐的配置冲突。本机直接安装,熟悉基本命令。结合 Docker 技术(参考 Docker 相关课程),搭建分布式集群环境。

2026-09-28 17:26:59 370 11

原创 【Python】(篇七)《使用Python库》 -- 详解

库就是别人已经写好的代码,我们可以直接拿来使用。。这里所说的,就是指这门语言是否拥有足够丰富的库,用来应对各类开发场景。实际开发中,不会所有代码都从零手写,而是充分利用现成的库,以此简化开发流程。

2026-09-27 16:00:17 624 17

原创 【Python】(篇六)《基础语法(函数、列表和元组、字典、文件)》---详解

def 函数名(形参列表):函数体return 返回值# def:define定义# 形参列表中可以有多个形参,多个形参(形式参数)之间用逗号分隔# 函数体要带有一定的缩进(带有缩进的代码才是函数内部的语句)# 函数执行到 return 就意味着执行完了,return 后面的值就是函数的返回值。

2026-09-27 13:51:37 319 14

原创 【Python】(篇五)人生重开模拟器(Python实现代码)

这是一款文字类小游戏。玩家输入角色的初始属性后,程序将根据属性条件触发不同的人生事件。注:完整程序代码较多,此处仅实现核心的某一段判定逻辑,主要目的是为了巩固前面学习的 Python 基础语法(如变量、条件判断、随机数、模块导入等)。

2026-09-26 11:09:13 222 15

原创 【Python】(篇四)《顺序语句、条件语句、循环语句)》---详解

条件语句能够表达 "如果 ... 否则 ..." 这样的语义. 这构成了计算机中基础的逻辑判定条件语句也叫做分支语句。如果 我认真敲代码我就很容易找到工作否则我就容易毕业就失业其中 "我认真敲代码" 称为条件.如果条件成立(条件为真), 则会出现 "我就很容易找到工作" 这个情况. 如果条件不成立(条件为假), 则会出现 "我就容易毕业就失业".当然, 同样的逻辑, 还可以反着表达.如果 我选择躺平摆烂我就容易毕业就失业否则我就很容易找到工作。

2026-09-26 09:34:26 217 15

原创 【Linux网络】四十六.《同步异步、阻塞非阻塞傻傻分不清?五种 IO 模型 + 妖怪蒸唐僧一次讲清》

也就是我们说的输入和输出,在当中,将输入输出。总结:IO 就是主机和外部设备之间的数据传输。OS 如何得知外设中有数据可读取?。操作系统需要有一种机制,判断对应外设是否已经准备好数据。。访问服务器时,客户端发出请求报文后,需要等待网卡收到服务器返回的响应。此时服务器可能还没收到请求、正在处理请求,或是响应报文还在网络上传输。操作系统不会持续主动轮询检测外设是否有数据。轮询会严重降低系统效率,绝大多数查询都是无效的空检测,白白消耗 CPU 资源。操作系统实际依靠中断机制感知外设数据就绪。

2026-09-25 21:52:18 469 10

原创 【Python】(篇三)《基础语法(常量和表达式、变量和类型、注释、输入输出、运算符)》---详解

创建变量的语句非常简单, 其中a 为变量名. 当我们创建很多个变量的时候, 就可以用名字来进行区分.= 为赋值运算符, 表示把 = 右侧的数据放到 = 左侧的空间中.注意变量的名字要遵守一定规则。硬性规则(务必遵守)变量名由数字、字母、下划线构成。数字不能开头。变量名不能和“关键字”重复。变量名大小写敏感,num和Num是两个不同的变量名。软性规则(建议遵守)a = 10变量名使用有描述性的单词来表示,尽量表达出变量的作用。一个变量名可以由多个单词构成,长一点没关系,但是含义要清晰。

2026-09-25 14:20:38 411 3

原创 【Python】(篇二)《搭建python环境小白也能轻松上手--超详解》

要想能够进行 Python 开发,就需要搭建好 Python 的环境。

2026-09-25 08:28:53 378 14

原创 【Python】(篇一)认识 Python:从计算机基础到python的背景,优缺点,以及前景发展

计算机需要硬件赋予之躯体, 也需要软件赋予之灵魂."软件" (或者叫做 程序), 指挥了计算机要按照什么样的规则来执行任务.软件不是凭空出现的,而是要被“开发”或“设计”出来的。制作软件,本质上就是明确这个软件要完成什么样的任务,这个过程称为“编程”,也可以叫作“软件开发”。换个例子:我对朋友说“帮我带杯奶茶,如果排队超过十分钟就算了”。这句话听起来没问题,但仔细一想就有歧义——是“超过十分钟就不买”,还是“超过十分钟就换一家买”?换作计算机,它不会猜,只会严格按字面执行,甚至直接卡住。

2026-09-25 07:58:51 238 10

原创 【Linux 网络】四十五.《网络基础(其他重要协议或技术:DNS、ICMP、NAT)》---详解

​编辑www.baidu.com。域名之间用. 来连接。com:一级域名,表示这是一个企业域名。处于同一层级的还有 .net(网络提供商)、.org(开源组织或非盈利组织)等。baidu:二级域名,即公司名。www:仅仅是一种习惯用法。过去人们使用域名时,常命名成 ftp.xxx.xxx、​编辑www.xxx.xxx这类形式,用来标识该主机所支持的协议。

2026-09-24 18:05:58 437 9

原创 【Linux 网络】四十四.《网络基础(数据链路层协议:以太网、ARP 协议)》

MAC 帧封装完毕后,路由器 A 就可以把封装好的 MAC 帧以广播的方式发送到局域网中。假设现在 MAC2 主机收到了这个报文,解包后发现目标 MAC 是全 F,说明这是一个广播帧。当它识别到 MAC 帧中的帧类型字段为 0806 后,就知道这是一个 ARP 请求或应答的数据包,于是会把 MAC 帧的有效载荷向上交付给 ARP 层。当 ARP 层收到数据包后,先比对 op 字段,判断这是请求还是应答。

2026-09-23 23:39:56 842 13

原创 DeepSeek 完全使用指南:网页版、API 使用、Cherry Studio 本地部署,一篇讲透

网页版 vs API:网页版免费适合手动用,API 按量付费适合程序自动化,8 块钱一个月几乎不花钱:API 是引擎,Cherry Studio 是驾驶舱,5 分钟配置完成,还能搭知识库实操部署:从注册、充值、创建 Key,到下载安装 Cherry Studio、接入模型、开始对话,12 张截图全程覆盖新手建议的上手顺序:先用网页版体验模型能力 → 充 1 元钱试 API → 用 Cherry Studio 做日常客户端 → 有需求了再搭知识库。一步一步来,别一上来就搞自部署。

2026-09-23 21:24:57 421 11

原创 【Linux 网络】四十三.《网络基础(网络层协议:IP 协议)》--下篇

遍历路由表条目。目的 IP 和子网掩码做按位与运算,匹配目标网络;匹配失败,则走默认网关。通过对应的 Iface 接口发送数据包。注意:IP 协议并不负责设备实际转发的动作,IP 提供。

2026-09-23 00:49:16 577 14

原创 【Linux 网络】四十二.《网络基础(网络层协议:IP 协议)》--上篇

IP 层的核心作用是定位主机,具有将数据从主机 A 发送到主机 B 的能力,但是能力并不能保证一定能够做到,所以这时就需要 TCP 起作用了,TCP 可以通过超时重传、拥塞控制等策略来保证数据能够发送到 B 主机。举例:在某个子网里,如果把 IP 地址的前 24 位当作网络号,那么对应的 32 位子网掩码,前 24 个比特就全部置 1,剩余 8 个比特置 0,转换成点分十进制写法就是 255.255.255.0。落在以上区间内的地址就是私有 IP,除此之外的地址属于公网 IP,也叫全局 IP。

2026-09-22 23:27:59 870 16

原创 【Linux 网络】四十一.《网络基础(传输层协议:UDP、TCP)》--终篇

因为 TCP 是面向字节流的,所以需要应用层来分开这些报文。如果处理得不好,就会出现多读了或者少读了,从而影响到后续报文,这种问题就叫做粘包。首先要明确,粘包问题中的“包”是指应用层的数据包。在 TCP 的协议头中,没有如同 UDP 一样的“报文长度”这样的字段,但是有一个序号这样的字段。不过要注意,TCP 首部里也有长度相关的字段,只是它不是用来标记应用层消息长度的。真正让 TCP 无法像 UDP 那样区分消息边界的,是 TCP 本身不保留应用层消息边界。

2026-09-22 11:33:00 725 18

原创 【Linux 网络】四十.《网络基础(传输层协议:UDP、TCP)》--中篇

MSL 是 TCP 报文在网络中的最大生存时间,TIME_WAIT 持续 2MSL,有两个原因。

2026-09-21 21:06:05 544 18

原创 【Linux 网络】三十九.《网络基础(传输层协议:UDP、TCP)》--上篇

我们的传输层协议主要负责数据能够从发送端传输接收端。

2026-09-21 13:25:04 460 17

原创 【C++微服务项目开发脚手架】(接口篇二)《C++微服务数据三件套:JsonCpp · HttpLib · Protobuf》

JsonCpp 是⼀个⾼性能的 JSON 库,⽤于处理 JSON 数据。它提供了完整的 JSON 标准⽀持,包括解析 JSON 字符串、⽣成 JSON 字符串、读写 JSON 对象和数组等功能。Protobuf 是 Google 开发的一种轻便、高效的结构化数据存储/交换格式,类似于 XML 或 JSON,但比它们更小、更快、更简单。Protobuf 定义了一种接口描述语言(IDL),用于描述数据结构,然后可以自动生成各种编程语言的代码来操作这些数据结构。cpp-httplib 是一个。

2026-09-20 18:11:40 389 23

原创 【Linux】三十八.C++ 手写 HTTP 服务器:裸 socket + fork 多进程,从 HTTP 报文解析到浏览器打开网页

C++ 网络编程实战 :C++、HTTP 服务器、socket 编程、fork 多进程、HTTP 协议解析、Linux 网络编程TCP 三次握手背得滚瓜烂熟,socket 那几个函数也会调,可一旦要自己攒一个 HTTP 服务器,很多人就卡住了:报文格式记不牢、不知道该切几层、写完也不知道对不对,只能靠"看起来能跑"自我安慰。更麻烦的是,等你真去读别人的 HTTP 服务器代码,往往是一坨——解析、网络、业务全糊在一个文件里,看不出哪层该干什么。这篇文章把这件事从头拆到底。

2026-09-19 16:54:41 470 8

原创 【C++微服务项目开发脚手架】(接口篇一)gflags + gtest + spdlog 接口学习笔记

函数签名DEFINE_bool(参数名, 默认值, 帮助描述);DEFINE_int32(参数名, 默认值, 帮助描述);DEFINE_string(参数名, 默认值, 帮助描述);DEFINE_double(参数名, 默认值, 帮助描述);参数表参数类型含义参数名标识符后面用FLAGS_xxx访问默认值对应类型用户不传命令行时用这个值帮助描述字符串-help时显示代码片段DEFINE_bool(reuse_addr, true, "使用启用地址重用选项");

2026-09-18 17:09:39 750 20

原创 【C++微服务项目开发脚手架】(环境篇)虚拟机 + Docker + MySQL/Redis/RabbitMQ/ES/etcd/FastDFS 全套配齐

docker是⼀个⽤Go语⾔实现的应⽤容器引擎开源项⽬,可以让开发者打包他们的应⽤以及依赖包到⼀个轻量级、可移植的容器中,然后发布到任何流⾏的 Linux 机器上,也可以实现虚拟化。其⼴泛应⽤于开发、测试和⽣产环境中,帮助开发者和系统管理员简化应⽤的部署和管理,实现快速的交付,测试和部署。

2026-09-17 20:49:50 448 18

原创 【C++微服务项目开发脚手架】(准备篇)从 0 到跑通:Docker 容器开发环境 + 宿主机用户 + Trae 远程连接 全链路踩坑实战

凡是跨了环境边界(宿主机 vs 容器、本地 vs 远程),就不能想当然地觉得"改一个另一个也会变"。宿主机和容器各是各的文件系统和密码库,本地和远程各是各的 SSH 配置——你要做的是先搞清楚两边各自管什么,再用 volume、SSH、bind mount 这些"桥"把它们连起来。Linux 不怕你踩坑,怕的是踩了坑不知道为什么踩的。每一个 Permission denied、每一个数字 UID、每一次"改了配置没生效",背后都是一个值得想通的原理。

2026-09-17 18:14:43 582 18

原创 【Linux网络加餐课】(篇八)网络版计算器(终篇):守护进程、标准 IO 重定向与部署打包

作用是把文件权限掩码清零,保证守护进程以后 open/创建文件时,传入的 mode 参数不被继承自 shell 的 umask 干扰(不同用户 shell 的 umask 可能是 022、077,创建日志/配置文件的权限就会不一致)。的意思是"让描述符 0 也指向 fd 所指的文件表项"(先把 0 原来指向的关掉,再重定向)。脱钩之后,终端上的 Ctrl+C(SIGINT)、Ctrl+\(SIGQUIT)、关窗口(SIGHUP)全都找不到它了——这就是"关掉 SSH 服务器不死"的直接原因。

2026-09-16 23:28:24 535 16

原创 【Linux网络加餐】(篇七)网络版计算器(中):协议落地、报文分隔与完整链路

JSON长度>\r\n{"x":10,"y":20,"oper":43}\n\r\noper是整数(ASCII 码),不是字符串JSON 末尾有个\n,是 FastWriter 自动加的尾换行<JSON长度>\r\n{"code":0,"result":30}\n\r\n。

2026-09-16 16:47:44 489 17

原创 【Linux网络加餐】(篇六)网络版计算器(上):模板方法模式、序列化与 JSON

定义一个操作的算法骨架,把骨架里某些步骤延迟到子类去实现。骨架(流程)在父类里写死,步骤的细节由各个子类各写各的。对应到 C++ 的手法就两板斧:父类里把可变步骤写成纯虚函数,只声明不实现,逼着子类实现;父类里写一个普通(非虚)函数,按固定顺序调用这些虚函数。这个函数就是"模板方法"。先澄清一个命名坑:这里的"模板"跟 C++ 泛型没有任何关系,纯属中文翻译撞词。工程和服务器讲完了,进入这节课的软件核心。先看// 约定好各个字段的含义,本质就是约定好协议!

2026-09-15 23:46:25 317 12

原创 【Linux网络】三十七.TCP 协议通讯流程

因为三次才能确认双向通道都通:第一次(SYN):服务器确认"客户端 → 服务器"方向能收;第二次(SYN+ACK):客户端确认"服务器 → 客户端"方向能收;第三次(ACK):服务器确认"客户端 → 服务器"方向能收(确认客户端收到了自己的 SYN+ACK)。两次握手只能验证单向连通,无法防止历史旧连接的 SYN 延迟到达导致错误建立连接。TCP 是全双工的,每个方向的关闭是独立的(这叫半关闭 half-close方向1(客户端→服务器):FIN ① → ACK ② = 2 次关闭一个方向。

2026-09-15 17:41:25 394 14

原创 【Linux】三十六.Linux 文件与目录操作终极指南:从新手到熟练运维

了在 Linux 下做 C++ 开发,脱离不了与文件和目录打交道。很多初学者在 Windows 的 IDE 里点鼠标习惯了,一进黑乎乎的终端就发懵,遇到mvcprm总是心惊胆战,怕一不小心就把几天的代码删没了。这种担心非常合理——Linux 没有"回收站"这个兜底(桌面版有,但服务器上没有),删了就是删了。。内容覆盖目录切换、增删改查、内容查看、编译运行、权限管理的全过程,最后用"把 lesson52 搬家到 lesson53"这个真实案例做一次实战复盘。

2026-09-14 22:21:13 629 16

原创 【Linux加餐(篇五)】从零手搓多线程 UDP 聊天室:小白也能看懂的进阶实战复盘

这不是失误,而是架构升级的自然结果:服务器现在只认"任务",至于任务是查词典、广播消息还是算斐波那契,全看 main 里塞给它什么。从"一个客服接所有电话"到"五个厨师 + 一个叫号器 + 一本熟客名册",lesson53 完成了从玩具到"小架构"的跨越。)也能送达所有人,包括他自己的客户端(实测 B 的屏幕上确实收到了 A 的 QUIT),大家才知道"他是走了,不是掉线"。全局唯一,谁用谁来拿。——睡觉和放锁必须捆绑进行,拆开做就有一瞬间"锁开了但人还醒着"或"人睡了锁还锁着"的窗口期,都是 bug。

2026-09-13 23:10:08 426 14

原创 【Linux网络加餐(三)】学习全记录:UDP 回声服务器 + 策略模式日志模块

INADDR_ANY。

2026-09-13 14:38:42 467 16

原创 【AI应用--白话大模型(篇十)】《一文全系列搞懂RAG技术:RAG从原理到应用,文本分块,向量嵌入,数据入库以及RAG未来的趋势发展》

可以想象是开卷考试,模型并不知道你的业务知识,但是查资料,然后组织答案。

2026-09-12 21:26:16 222 15

原创 【AI应用---白话大模型(篇九)】《一文看懂Agent:CLI 智能体、上下文窗口与大模型幻觉》---详解

⼤模型的“幻觉”(hallucination)是指它⽣成的内容看似合理,但实际上是错误、虚构或与事实不符的现象,也就是⼤家常说的⼀本正经的胡说⼋道。我们来看个例⼦,可以看到汤⽼师变成鹏哥了,⽽且说的振振有词值得注意的是,幻觉并不总是坏事。在创意写作、头脑⻛暴等需要发散性思维的场景中,这种“创造性”是优点。但在需要事实准确性、可靠性的场景(如医疗、法律、⾦融、代码⽣成)中,幻觉就是致命的缺陷。

2026-09-12 11:25:00 567 23

原创 【Qt】(篇二)《信号与槽:信号和槽的概述,使用、自定义信号和槽、信号与槽的连接方式、信号和槽的其他说明》---详解

Qt5 在 Qt4 的基础上提⾼了信号与槽的灵活性,允许使⽤任意函数作为槽函数。但如果想⽅便的编写槽函数,⽐如在编写函数时连函数名都不想定义,则可以通过Lambda表达式 来达到这个⽬的。Lambda表达式 是 C++11 增加的特性。C++11 中的Lambda表达式⽤于定义并创建匿名的函数对象,以简化编程⼯作。

2026-09-11 16:08:37 231 12

原创 【软件测试】(概念篇)《需求的概念,测试用例(case),软件错误(bug),开发模型以及测试模型》---详解

随着软件⼯程学科的发展,⼈们对计算机软件的认识逐渐深⼊。软件⼯作的范围不仅仅局限在程序编写,⽽是扩展到了整个软件⽣命周期,如软件基本概念的形成、需求分析、设计、实现、测试、安装部署、运⾏维护,直到软件被更新和替换新的版本。软件⼯程还包括很多技术性的管理⼯作,例如过程管理、产品管理、资源管理和质量管理,在这些⽅⾯也逐步地建⽴起了标准或规范。

2026-09-10 23:00:31 400 13

空空如也

空空如也

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

TA关注的人

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