自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式IoT数据采集与存储系统(项目复盘)

用 ChatServer 做接入网关,用 Broker 做简化消息队列和轮询负载均衡,用多个 WriteDB 做消费者写 MySQL。通过 TCP + JSON + 换行分帧,把接入、转发、存储解耦,形成一个可扩展、可故障隔离的小型分布式数据管道。

2026-10-12 20:16:20 741

原创 【C++八股】内存深刻讲解

栈快(连续内存,CPU一级缓存,直接编译成指令加减栈指针);堆慢(离散内存,二级缓存,系统调用开销大)。栈是“先进后出”的叠盘子;堆是“动态分配”的大仓库(类似链表管理,容易产生内存碎片)栈是系统自动的,放局部变量;堆是程序员手动的,用 new/malloc。接下来我们去理解上面得这句话。怎么去理解上面的这句话呢?

2026-10-05 15:08:44 191

原创 【C++】智能指针

unique_ptr:一个人拥有,要给别人就需要std::move,出了大括号自动释放shared_ptr:多人合租,计数归0才释放,用make_shared创建weak_ptr:只观察不拥有,用lock()确认还活着。专门解决循环引用。

2026-10-04 15:36:29 476

原创 C++11之一场名为“搬家”的 C++ 之旅

在C++中,每一个变量或者表达式,都有一个身份:要么是左值,要么是右值比如:int a = 10;这里的a就是左值。你看可以通过&a找到它的家庭住址比如10,a + 5,或者一个函数返回的临时对象。它们马上就要消息了,你没法用&取它们的地址。

2026-10-04 14:37:40 211

原创 深入理解RpcRouter(远端调用模块)

RpcRouter 模块的设计哲学是“先验后行,安全第一”。在网络通信中,我们绝不能盲目信任客户端传来的数据。如果客户端恶意传入错误的参数(比如本该传 int 却传了 char),直接执行底层业务函数可能会导致服务端崩溃。因此,RpcRouter 强制要求每个注册的服务都必须提供(服务描述)。在收到请求时,它利用哈希表快速定位方法,并严格执行参数校验。只有符合规范的请求,才会被真正放行去执行业务逻辑。这种设计不仅保证了服务端的稳定性,也为后续的自动化服务发现和注册提供了数据支撑。

2026-10-03 20:00:56 107

原创 分布式RPC框架实战(二):服务端模块划分与底层设计

首先,我们需要明确服务端的功能需求。本质上,服务端需要基于网络通信接收客户端的请求,并提供以下三类服务:提供PRC服务提供服务注册与发现、上线&下线通知提供主题操作(创建/删除/订阅/取消)及消息发布基于以上功能需求,我们在服务端划分出了7个模块,为了方便理解,用文字结构来表示它们的层级关系:接下来,我们自底向上,逐一刨析每个模块的核心职责模块存在的意义:这是整个服务端的基石。该模块为网络通信模块,实现底层的网络通信功能。技术选型:因为网络通信模块本质上是一个比较复杂庞大的模块。因此,鉴于项目的庞大,

2026-10-03 19:16:38 282

原创 拒绝粘包!基于 C++ 手把手带你实现一个自定义 LV 协议

算一下,总共100字节,我已经用了 4+4+4+8=20 字节,还剩。

2026-10-02 15:32:41 899

原创 分布式RPC框架实战(一):分布式 RPC 的核心思想

PRC远程调用(主干):客户端 -> 注册中心找地址 -> 直接连服务端 -> 服务端执行方法 -> 返回结果服务注册与发现(神经系统):服务端上线/下线 -> 通知注册中心;客户端调用前 -> 询问注册中心。保证系统知道谁活着、谁在干活发布订阅(广播系统):发布者 -> Broker -> 根据 Topic 分发给订阅者。实现异步通信和多对多通信。

2026-10-02 13:09:10 354

原创 《基于muduo和httplib的分布式IoT数据采集与存储系统》

难点解决方案效果TCP 粘包\n分隔符 + 循环拆包消息边界正确高并发连接支撑数千并发JSON 解析异常解析 + 字段双重校验不崩溃、不写脏数据写库负载均衡Broker 轮询转发多实例分担压力SQL 注入escape 转义安全多线程竞争mutex 加锁线程安全连接断开从列表移除无野指针、无泄漏前后端跨域CORS 头前端可正常请求单机耦合拆分为 5 个模块解耦、可扩展1. 数据采集与传输。

2026-10-02 01:59:52 345

原创 【C++】手撕JRpc框架(梳理RPC流程)

PRC 远程过程调用,是,而不需要了解底层网络通信细节,PRC可以使用多种网络协议进行通信,如HTTP、TCP、UDP等,并且在TCP/IP网络四层模型中跨越了传输层和应用层。简而言之等,就是像调用本地方法一样调用远程方法。

2026-10-02 00:07:59 371

原创 【C++】C++11之function函数包装器

普通函数,Lambda,仿函数,类成员函数都能直接调用,但遇到两种情况,原生写法会很麻烦function 就是C++11给出的解决方案,它是一个通用可调用对象包装器,只要参数和返回值匹配,不管是什么类型,都能封装成统一类型,方便存储,传递和调用不同的品牌的家电(普通函数、Lambda、仿函数...),本来遥控器不通用:空调遥控器只能开空调,电视遥控器只能开电视而function就是万能遥控器,只要家电符合【参数+返回值】的适配规则,都能绑定到这个遥控器上,之后统一按按钮调用即可。

2026-09-29 14:09:09 212

原创 【C++】C++11之Lambda

Lambda是C++11新增的匿名函数,就是不需要提前定义一个命名函数,可以直接在需要的地方写逻辑的小函数。它的本质就是:编译器自动生成的临时坊函数类,天生支持 std::function 包装,可以像普通函数一样直接调用。

2026-09-28 17:27:47 230

原创 【C++】 网络编程实战:带你用 muduo 搭建一个高性能 TCP 服务

主要接口TcpServer{//启动服务器//设置连接建立/关闭时的回调函数//设置消息处理回调函数eg:你开了一家餐厅,你雇佣了一个迎宾(muduo 库的 Acceptor)。你给迎宾发了一本《迎宾与送客手册》,这就是。如果客人来了(你就说:“欢迎光临!”(打印日志)带客人去空桌子坐下(分配资源)把菜单递给他(准备接收数据)如果客人走了(你就说:“欢迎下次再来!”(打印日志)把桌子收拾干净(释放资源)把客人从名单上划掉(代码长这样子// 客人来了,执行“迎宾”操作} else {

2026-09-23 12:32:23 154

原创 【C++】Json库介绍和使用

Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化,它实现了将多个数据对象组织成为 Json 格式字符串,以及将 Json 格式字符串解析多个数据对象的功能先看一下 Json 对象类的表示// Value重载了[]和=,因此所有的赋值和获取数据都可以通过// 简单的方式完成 val["name"] = "xx";// 移除元素// 添加数组元素 val["score"].append(88);// 获取数组元素个数 val["score"].size();

2026-09-22 20:00:59 165

原创 【C++】JRpc手撕框架 环境搭建

先备份原来的 /etc/apt/source.list 文件。2、在新的 sources.list 输入新的源文件。1、把原来的 sources.list 给备份一下。一般情况下都会默认自带wget。可以先查看,如果没有就进行安装。在添加源文件内容,添加以下文件。5、安装编译器 gcc/g++6、安装项目构建工具make。10、安装jsoncpp。7、安装调试器 gdb。3、新增完毕后更新源。

2026-09-22 11:41:35 223

原创 【C++算法】动态规划背包问题 -> 01背包

当我们遍历 i 的时候,而我们的 j 在遍历重量,是不是只有当我们 j >= 物品的重量才可以去选。当我们遍历i的时候,我们是不是可以不选当前这个物品,我们的状态表示方程。注意:我们选完它的物品,此时我们是不是要减去它的重量,在加上它的价值。因为在同一个空间改数据,如果不小心,会把没用的旧数据提前覆盖掉!既然只需要上一行,那我干脆只保留一行,不断覆盖更新。i表示我们要遍历的数组,j表示我们遍历的重量。总结:这就涉及到我们的选和不选的问题了。注意:覆盖原来空间也就是数组,就叫做。1、所有的用品,只能选一次。

2026-08-31 12:32:52 238

原创 【MYSQL进阶】-> 索引理解

注意:这里并没有按照主键的大小顺序插入。

2026-08-30 19:29:51 215

原创 MYSQL【进阶】 -> 索引(了解)

索引是物美价廉的东西,不用加内存,不用改程序,不用调sql,只要执行正确的create index,查询速度就可能提高成白上千但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除为代价的,这些写操作,增加了大量的IO所以它的价值,在于提高一个分为:主键索引唯一索引普通索引全文索引 ————解决中子文索引问题。

2026-08-27 12:35:40 190

原创 【C++八股】面向对象

往期八股背诵。

2026-08-26 12:16:48 220

原创 【C++八股文】面向对象

C++中的构造函数分别有4中:默认构造函数、初始化构造函数、拷贝构造函数、移动构造函数。默认构造函数和初始化构造函数:是在定义类的对象时候,完成对类的初始化工作。默认构造函数和初始化构造函数是在定义类对象的时候,完成对类的初始化工作。只定义析构函数,编译器会自动为我们生成默认构造函数和拷贝构造函数。移动构造函数:用于定义其他类型的变量,隐式转换为本类对象。拷贝构造函数:赋值构造函数默认实现的是值拷贝(浅拷贝)拷贝构造函数:赋值构造函数默认实现的是浅拷贝(值拷贝)

2026-08-24 12:29:20 307

原创 【C++八股】面向对象

只有函数体不同(花括号内),派生类对象调用的时候会调用派生类重写的函数,不会调用被重写的函数。在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数,如果对象是基类,就调用基类的函数。2、重载是指同一个访问区内被声明的几个具有不同参数列(参数的类型、个数、顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。3、多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。

2026-08-24 12:03:52 232 1

原创 【C++算法】二分查找 -> 入门

在二分查找中,它是最恶心,细节最多,最容易写出死循环的算法,但是只要我们把它弄清楚,去理解,最恶心就会变得最简单了。

2026-08-11 02:10:40 660 1

原创 【C++】模板进阶

模板复用了代码,节省资源,更快的迭代开发,因此C++的标准库(STL)因此而产生增强了代码的灵活性。

2026-08-08 10:37:11 226

原创 带你玩转 -> C++之多态

目录多态多态的构成条件虚函数虚函数重写C++11 override和final重载、覆盖(重写)、隐藏的对比抽象类概念接口继承和实现继承多态的原理虚函数表动态绑定和静态绑定单继承和多继承关系的虚函数表单继承的虚函数表多继承的虚函数表继承和多态的常见面试问题多态的问答题多态到底是什么呢?多态就是函数调用的多种形态,调用函数更加灵活,具体点就是完成某个行为,当不同的对象去完成时会产生出不同的状态先带大家看一段程序,感受一下多态到底是什么?此时我们可以发现并没有构成多态,打印的都是父类的函数,因为形成多态具

2026-08-05 16:40:02 207

原创 C++算法之位运算(十分钟带你速通)上

2、扫描一次字符串,当出现第一次就++,再继续扫描,如果同样的也就是++,我们可以特判,此时大于1就是重复了,直接false,否则继续扫描,扫描完没有重复就true。开一个哈希表,扫描一下原来的数组,把数组里面的数字映射到哈希表,然后哈希表改成1,最后在扫描一下哈希表,如果是0就是丢失的数字。把数字的1~n的下标给求和起来,记住一定是下标,最后的值减去数组里面的值就是丢失的数字。例如:【3,0,1】,下标求和是6,6-3-1=2,那这个不就是丢失的数字吗?0,1,3是不是消掉了,剩下2?

2026-08-03 22:52:30 169

原创 这篇文章让你懂->Qt串口通信(嵌入式上位机开发)

做完前两个步骤,我们即将开始实现一个串口通信。

2026-05-27 21:17:07 5733

原创 Linux网络之网络编程套接字

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接受主机把从网络上接到的字节依次保存在接收缓冲区中,也是按按内存地址从低到高的顺序保存因此,网络数据流的地址应该这样规定:先发出的数据是低地址,后发出的数据是高地址。TCP/IP协议规定:网络数据流应采用大端字节序,即低地址高字节。不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据。如果当前发送主机是小端,就需要先将数据转换大端;否则就忽略。直接发送即可。

2026-05-27 14:07:08 5290 2

原创 git--初识、基本操作

我的 Linux 操作系统是 Ubuntu 24.04.4 LTS,运行在虚拟机中,是一个全新的、未安装额外软件的环境。

2026-05-26 19:08:40 6703 4

原创 网络基础(一)

网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来,形成一个相互通信和共享资源的系统。

2026-05-14 17:26:39 6831 7

原创 Qt常用控件-> 3、输入类控件、多元素控件、容器类控件、布局管理器

设置 - 减小 value,设置 = 增加 value默认情况下滑动条可以通过方向键或者调整大小。(1)在界面上创建滑动条和 label(2)创建 valueChanged 的 slot 函数(3)修改 widget.cpp 构造函数,增加快捷键使用 QShortCut 类设置快捷键快捷键触发时,会发出 QShortcut::activated 信号,我们连接到⾃⼰写的 slot 函数(4)编写自定义 slot 函数(5)执行程序。

2026-05-11 14:14:42 5634 7

原创 C++之STL->string类的使用和实现

计算机中只有二进制0、1,我们如何去表示文字呢?建立对应的编码表1、ASCII->支持英文,1字节==8bit,有符号有0-255种表示方法,ascii编码表就是对256个值建立一个对应的表示值。

2026-05-08 17:28:44 5182 4

原创 线程同步与互斥详解

在保证数据安全的情况下(一般使用加锁方式),让多个执行流按照特定的顺序进行临界资源的访问,从而有效避免饥饿问题称之为同步举个例子:你和你的朋友两个人在盘子里取苹果和放苹果,你负责在盘子里放苹果,你朋友负责在盘子里取苹果,你两不能同时取和同时放,所以是互斥,你需要申请锁先加锁,然后放苹果,如果有苹果则等待,释放锁通知你朋友来取苹果,如果没有则放完苹果释放锁即可,然后你朋友来取苹果,首先申请锁,如果盘子里没有苹果则等待,释放锁,通知你来取苹果,如果有苹果则取完苹果释放锁即可。

2026-05-07 15:27:49 5762 3

原创 Qt常用控件-> 2、按钮类控件、显示类控件

回顾常用控件文章。

2026-05-07 15:24:15 5927

原创 Qt常用控件-> 1、概述、QWidget核心属性

Widget是Qt中的核心概念,英文原意是”小部件“,此处也把它翻译为”控件“。控件是构成一个图形化界面的基本要素像上述示例中的按钮、列表视图、树形视图、单行输入框、多行输入框、滚动条、下拉框都可以称为”控件Qt作为一个成熟的GUI开发框架,内置了大量的常用控件。这一点在Qt Designer中就可以看出来,并且Qt也提供了“自定义控件”的能力,可以让我们在现有控件不能满足需求的时候,对现有控件做出扩展,或者手搓新的控件。

2026-05-07 13:57:36 5373 3

原创 终端环境下:Ubuntu 22.04.1 安装 MySQL 数据库

sudo service mysql status # 查看mysql service的状态查看,可以发现我们数据库服务端,正在运行...

2026-04-30 22:05:15 438 12

原创 Linux操作系统 -> 线程基础(小白也能学会的线程)

在一个程序里的一个执行路线就叫做线程,更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行很多书籍提供的线程概念是:线程是进程的一个执行分支,是在进程内部运行的一个执行流那么线程到底是什么?下面我们来开始具体的介绍一下进程概念。

2026-04-30 22:05:02 5566 4

原创 QT->信号与槽详解下补充(概述、使用、自定义、连接方式、其他说明)

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

2026-04-05 16:27:57 608 5

原创 Linux操作系统 -> 进程信号(下)

这句话需要一点澄清。并不是所有的修改都会立即写回到内存。CPU通常会在适当的时机(例如,当寄存器不再需要存储该值,或者在特定指令如write-back操作时)将寄存器中的值写回内存。这种策略可以进一步优化性能,因为它减少了内存访问的次数。

2026-04-05 15:52:01 755 5

原创 QT->信号与槽详解下(概述、使用、自定义、连接方式、其他说明)

自定义信号在实际开发中很少需要用到,Qt内置的信号就足以应付大部分的开发场景所谓Qt的信号,本质上也就是一个函数,在Qt5以及更高的版本中,槽函数和普通的成员函数之间没有什么差别。但是,信号是一类非常特殊的函数,我们只要写出函数声明,并告诉Qt这是一个信号即可。这个函数的定义是Qt在编译过程中自动生成的1、自定义信号函数必须写到“signals”下2、返回值为void,只需要声明,不需要实现3、可以有参数,也可以发送重载此处的signals是Qt自己扩展的关键字。

2026-04-04 23:31:12 581 3

原创 Linux操作系统 - > 进程信号(中)

实际执行信号的处理动作称为信号递达信号从产生到递达之间的状态,称为信号未决进程可以选择阻塞某个信号被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在抵达之后可选的一种处理动作。

2026-04-04 22:10:38 533 2

空空如也

空空如也

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

TA关注的人

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