- 博客(444)
- 收藏
- 关注
原创 设计自己的小传输协议 状态机解析与封装抽象
本文介绍了一个自定义数据传输协议的状态机实现方案。通过C++类DataProtocolizedController封装了协议的核心逻辑,使用状态机模式处理数据包的解析与封装。该协议支持文件传输功能,包含起始帧、数据帧和结束帧三种类型,实现了分块传输、进度反馈和错误处理机制。协议头部定义了文件ID、偏移量、总大小等元信息,并支持文件名传输。代码展示了如何通过状态转换(ReadingHeader/ReadingName/ReadingData)逐步解析接收到的数据,同时提供了发送各类数据帧的接口方法。该设计具有
2025-07-26 14:21:03
222
原创 设计自己的小传输协议 导论与概念
本文介绍了自定义网络传输协议的设计要点,重点讨论了协议头结构和CRC校验机制。在协议头设计方面,作者提出了7个关键原则,包括简洁高效、必要元数据、长度管理、字节序统一、完整性校验、可扩展性和安全防护。作者展示了一个紧凑的协议头结构设计示例,采用32位magic number、版本号、状态标识等字段,并详细说明了状态机设计。在CRC校验部分,文章讲解了CRC的基本原理和工作流程,包括模2除法的特点、计算示例以及CRC-32的高效查表法实现,为数据传输提供可靠的错误检测机制。
2025-07-26 14:07:14
575
原创 快速入门Socket编程——封装一套便捷的Socket编程——封装接口
本文介绍了一个基于Reactor模式的Socket编程封装框架,采用C++实现跨平台网络通信。核心设计包括: 异步回调机制 - 通过ServerWorkers和ClientWorker结构体封装各种回调函数(连接建立、数据接收、关闭处理等),实现业务逻辑与网络层的解耦 pImpl惯用法 - 使用接口类(ServerSocketInterface/ClientInterface)隐藏平台相关实现(ServerSocket/ClientSocket),通过unique_ptr自动管理资源 Reactor模式 -
2025-07-25 10:50:47
447
原创 快速入门Socket编程——封装一套便捷的Socket编程:基于Epoll的框架思路说明
Socket编程与Epoll框架摘要 本文详细介绍了Linux下基于epoll的高性能Socket编程框架。epoll作为I/O多路复用机制,相比select/poll具有O(1)事件查询优势,适用于高并发场景。文章从epoll原理、API使用、触发模式(LT/ET)到非阻塞设置等核心概念进行剖析,并提供了事件循环的典型写法及常见工程实践要点。 在实现层面,框架分为配置、监听、epoll初始化和事件循环四个阶段:1)配置阶段完成协议参数映射;2)监听阶段创建socket并绑定端口;3)epoll初始化设置非
2025-07-25 10:43:37
1116
原创 快速入门Socket编程——封装一套便捷的Socket编程——Reactor
本文介绍了Socket编程中的Reactor和Proactor两种设计模式。Reactor是一种基于事件驱动的同步I/O模型,通过epoll等机制监听多个I/O句柄,在事件就绪时分发给对应处理器。文章详细说明了Reactor的工作流程、核心组件及特点,并提供了示例代码片段。作为对比,Proactor是异步I/O模型,内核完成I/O操作后通知应用程序。最后分析了两种模式的差异,并解释了项目中选用Reactor的原因,主要由于Linux平台epoll的成熟性和高效性。文章为理解高性能网络编程提供了清晰的技术框架
2025-07-25 10:33:52
670
原创 快速入门Socket编程——封装一套便捷的Socket编程——导论
本文介绍了Socket编程的核心流程与关键API,包括socket创建、bind端口绑定和listen监听设置。重点讲解了socket()函数中domain、type和protocol参数的含义,bind()函数中sockaddr结构体的使用及字节序转换问题,以及listen()函数中backlog参数对连接队列的影响。文章还提供了避免端口绑定冲突的SO_REUSEADDR技巧,为后续封装Socket编程接口奠定了基础。
2025-07-25 09:38:00
1062
原创 QML速学笔记1
QML速学笔记摘要 本文介绍了QML基础组件的使用方法,重点讲解了Window、Rectangle和Item三种核心组件。 Window组件是QML应用的顶级窗口容器,主要属性包括: 窗口可见性(visible)、大小(width/height) 标题(title)、最小/最大尺寸限制 窗口标志(flags)、背景色(color) 位置(x/y)、模态类型(modality) Rectangle组件用于创建可视化元素,支持: 大小(width/height)、颜色(color) 圆角(radius)、边框(
2025-07-24 13:12:40
352
原创 算法八股文:说一说快速排序和堆排序(C++)
快速排序采用分治思想,通过选取基准值将数组分为两部分递归排序,优化措施包括随机化基准值、三数取中法和混合插入排序。堆排序基于完全二叉树特性,先构建大顶堆,然后不断交换堆顶元素与末尾元素并调整堆结构。两种算法各有优劣:快速排序平均时间复杂度O(nlogn)但可能退化,堆排序稳定保持O(nlogn)但实现较复杂且不稳定。实际应用中常采用优化版的快速排序(如三数取中+小数组改用插入排序)。
2025-07-23 12:37:21
647
原创 网络编程系列:C++使用Linux的API快速获取网卡信息(AddressInfo)
本文介绍了在Linux系统下使用C++获取网卡信息的方法,重点解析了getifaddrs()和freeifaddrs()这两个API的使用。文章详细讲解了struct ifaddrs结构体的各个成员,包括链表指针ifa_next、接口名称ifa_name、标志位ifa_flags、IP地址ifa_addr、子网掩码ifa_netmask以及广播/点对点地址等。最后提供了一个示例代码,展示如何遍历网卡信息链表并获取IP地址等网络接口信息。该技术可用于开发网络库或网络监控工具,是网络编程的基础知识。
2025-07-23 08:45:54
508
原创 C/C++网络编程之快速整理Socket编程模板
本文整理了C/C++中Socket网络编程的核心知识点,包含以下内容:1) 关键函数如socket()、bind()、listen()等;2) TCP/UDP通信流程;3) I/O模型(阻塞/非阻塞/select/epoll)和并发方式;4) 粘包问题解决方案;5) Qt网络编程示例;6) TCP/UDP服务端代码示例;7) 多线程/多进程服务器实现;8) select/epoll高并发模型。文章提供了清晰的代码模板和流程图解,适合开发者快速掌握网络编程核心概念和实现方法。
2025-07-18 10:07:31
377
原创 嵌入式Linux八股文1:仔细说说UBoot的启动流程
本文详细分析了U-Boot在嵌入式Linux系统中的两种启动流程:无设备树(ATAG)和有设备树(DTB)方式。核心流程包括:CPU上电初始化、SPL阶段准备、重定位前硬件初始化(board_init_f)、代码重定位与修正、完全初始化(board_init_r)。关键区别在于有设备树方式需要加载并调整DTB文件,通过fdt命令修改硬件信息,最终将DTB地址传递给内核。文章还对比了两种方式下内核参数传递机制,并梳理了Linux内核启动后的设备树解析流程。整个过程体现了从底层硬件初始化到高级功能准备的完整启动
2025-07-18 09:42:44
871
原创 使用Proxy设计模式来增强类的功能:ToastProxy和DesktopToast的设计关系
这个算设计模式的部分,笔者当时正在设计的是如何让我的Desktop支持扩展的从Protocol Json Buffer转换到我的Toast可以识别的Meta Info的问题。这也是笔者写下这篇设计文档的原因——设计文档鸽了一个月(之前一直认为这个项目还没有成型的框架,因此迟迟没有动笔)
2025-07-17 18:44:29
1447
原创 Leetcode Easy刷题:合并两个连续系列
我们下面准备聊的是合并两个连续数组:给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。**注意:**最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。 很显然,我们的第一个反应就是,
2025-07-16 12:23:19
334
原创 Leetcode Easy题小解(C++语言描述)1
摘要 本文介绍了几个LeetCode简单题的C++解法: 相交链表 - 两种解法:使用unordered_set存储节点查询重复(O(n)空间),或快慢指针同步遍历(O(1)空间)。 链表反转 - 通过三指针法(当前、前驱、后继)逐步反转节点指向。 回文链表 - 利用栈的FILO特性,先压栈再比对,时间复杂度O(n)。 前K高频元素 - 先用哈希表统计频率,再用大根堆获取前K个。 快速选择算法 - 使用快速排序的partition思想在O(n)时间复杂度内找到第K小元素,避免完全排序。 这些题目涵盖了链表操
2025-07-15 10:18:14
943
原创 我的LeetCode刷题笔记——树(1)
二叉树基础概念回顾:节点结构、遍历方式分类(前序/中序/后序/层序) 层序遍历核心框架:使用队列实现BFS,时间复杂度O(n) Z字形遍历实现技巧:通过方向标志位和reverse操作实现锯齿形输出 典型题目解析:提供层序遍历(题目1)和分层输出(题目2)的代码实现 复杂度分析与扩展思路:讨论时间/空间复杂度,并建议后续刷题顺序(从基础层序到Z字形遍历)
2025-07-10 11:53:40
264
原创 C++面试冲刺笔记1:虚函数的基本工作原理
本文深入探讨C++虚函数的工作原理及实现细节。虚函数通过virtual关键字实现运行时多态,其本质由虚函数表(vtable)支持,每个含有虚函数的类会生成一个虚函数表指针(_vptr)。关键点包括:派生类可继承虚性,建议使用override确保正确重写;纯虚函数强制子类实现;虚析构函数确保正确析构链。多重继承时,每个基类子对象拥有独立的vptr和vtable。实际应用中,虚函数与非虚成员共存,需注意内存布局。虚函数机制是C++实现动态多态的核心,理解其原理对面试和开发都至关重要。
2025-07-09 21:36:23
1062
原创 我的Leetcode刷题笔记:栈和队列
数据结构结构特点操作方式STL 实现类栈 Stack后进先出(LIFO)队列 Queue先进先出(FIFO)双端队列 Deque两端可进出优先队列 PriorityQueue自动排序队列(堆)🧩题目名称:设计一个支持获取最小值的栈使用两个栈:一个正常存储所有元素;一个辅助栈实时维护当前“最小值”;每次 push/pop 都要判断是否更新辅助栈;所有操作时间复杂度 O(1)。栈/队列问题的本质是**“顺序控制”与“范围控制”**;
2025-07-09 09:14:41
468
原创 我的Leetcode刷题笔记:字符串
总结了LeetCode字符串相关题型的解题思路与技巧,涵盖5类常见问题:字符串拆分替换、单词反转、字符串轮转、字符串转整数和有效数字判断。重点解析了路径加密和动态密码更新的实现方法,提供了C++代码示例和复杂度分析。对于字符串转整数(myAtoi)问题,详细说明了处理步骤,包括跳过空格、符号处理、数字转换和溢出检查。所有方案均注重边界条件处理,时间复杂度一般为O(n),空间复杂度从O(1)到O(n)不等。这些方法适用于面试准备和算法练习,强调标准化流程与高效实现。
2025-07-08 09:59:22
1015
原创 讨论QString的各种to
Qt字符串编码与转换指南 核心要点 字符编码基础:UTF-8是可变长度编码(1-4字节),UTF-16固定2/4字节,GBK是中文专用编码 QString特性:内部使用UTF-16存储,支持国际化字符 关键转换方法 编码转换:提供toUtf8()(网络/文件)、toLocal8Bit()(本地系统)、toLatin1()(西欧字符) 数值转换:包括toInt()、toDouble()等,可带成功状态检测 C++兼容:toStdString()转换为标准库字符串 应用场景建议 跨平台:优先使用UTF-8 本地
2025-07-07 14:01:46
630
原创 如何使用Qt创建一个浮在MainWindow上的滑动小Panel
之前笔者去其他城市做了点事情,现在回到家中可以好好的扩展一下自己的Qt的功能库。笔者最近正在给我的小日历写一个超级简单的浮动的小窗口,源码中就是一个简单的小PanelWidget,比起来更加像是一种静态的可继承的扩展库(Floatable Panel Property),注意到的朋友可以自行继承PanelWidget,无论是带有Ui文件者还是其他均可复用。
2025-07-05 19:47:17
465
原创 深入理解Qt的SetWindowsFlags函数
Qt窗口标志函数详解 setWindowFlags()是Qt中控制窗口行为和外观的关键函数,它通过设置Qt::WindowFlags来定义窗口类型和提示标志。窗口类型包括Qt::Window、Qt::Dialog等基本类型,而提示标志如FramelessWindowHint、WindowStaysOnTopHint等则控制具体显示特性。调用此函数后,需要重新显示窗口才能使更改生效。 文档详细解析了WindowType枚举,包含基础窗口类型、类型掩码、Windows特定提示和标题栏控制标志等
2025-07-05 19:22:03
612
原创 在WSL下搭建JavaWeb: JDBC学习环境
摘要 本文详细介绍了在WSL环境下搭建JavaWeb开发环境的过程,重点围绕JDBC学习环境的配置。内容包括MariaDB数据库的安装与配置(含安全设置),OpenJDK 21的安装验证,以及使用Maven创建Java项目的具体步骤。作者提供了完整的代码示例,演示了如何通过JDBC连接MariaDB数据库并执行查询操作。整个过程涵盖了数据库用户创建、Maven依赖管理、JDBC驱动程序配置等关键技术点,为JavaWeb初学者提供了一个完整的环境搭建指南。 (150字)
2025-06-25 08:46:28
572
原创 从C++编程入手设计模式——访问者模式
摘要:访问者模式是一种将对象结构与操作逻辑分离的设计模式,适用于数据结构稳定但操作变化频繁的场景。文章以C++为例,介绍了访问者模式的基本组成、双重分派机制以及与策略模式、命令模式的区别。还讨论了访问者模式的变体设计和适用场景,最后布置了实现几何图形面积计算器的练习题,要求使用访问者模式在不修改已有逻辑的情况下添加新图形。访问者模式的典型应用包括编译器AST处理、报表生成等。
2025-06-22 08:54:06
825
原创 从C++编程入手设计模式——责任链模式
摘要 责任链模式是一种行为设计模式,通过将多个处理对象连接成链来处理请求,每个对象可决定是否处理或传递请求。文中以C++实现为例,展示了该模式的核心结构和代码模板:抽象处理器基类定义处理接口,具体处理器继承实现特定逻辑,并通过setNext方法形成处理链。该模式适用于日志系统、表单验证等需要动态选择处理者的场景。与策略、装饰器等模式相比,责任链强调请求的链式传递而非单一处理或功能增强。文章还探讨了变体设计(如全参与处理、动态排序)并提供日志分类系统的练习题目,要求实现基于类型选择处理器的责任链解决方案。
2025-06-22 08:39:44
1391
原创 从C++编程入手设计模式——命令模式
文章摘要: 命令模式是一种将操作封装为对象的优雅设计模式,适用于需要支持撤销、重做或记录操作历史的场景。该模式包含四个角色:命令对象(封装操作)、接收者(执行操作)、调用者(触发命令)和客户端(组织关系)。通过C++示例展示了遥控器控制家电的实现方式,其中命令对象与接收者解耦,调用者只需触发命令而无需了解具体实现。该模式优点在于解耦和扩展性(支持撤销/重做/组合命令),但会因每个操作对应一个类而导致类数量膨胀。最后提出文本编辑器练习题,要求实现带撤销功能的命令模式应用。
2025-06-22 07:57:32
501
原创 从C++编程入手设计模式——观察者模式
观察者模式简直就是字如其名,观察观察,观察到了告诉别人。观察手的作用如此,观察者模式的工作机制也是如此。。
2025-06-21 20:35:57
472
原创 从C++编程入手设计模式——装饰器模式
摘要:装饰器模式是一种结构型设计模式,允许在不修改原有类的情况下动态添加功能。通过"包裹"已有对象,可以在运行时灵活扩展行为,比继承更加灵活且符合开放封闭原则。文章以C++代码示例展示装饰器模式的基本结构,对比了其与继承的区别,并列举了图形界面、流操作等典型应用场景。最后提供了文本输出装饰器的练习题目,要求实现可组合嵌套的多种文本装饰功能。
2025-06-19 20:49:51
701
原创 从C++编程入手设计模式——策略设计模式
本文介绍了策略设计模式在C++编程中的应用。策略模式适用于对象行为需要根据不同场景动态切换的情况,如动物叫声、排序算法或支付方式的选择。文章通过示例代码展示了策略模式的三要素:策略接口、具体策略实现和上下文类,并指出相较于if-else实现的优势:更易维护、扩展和测试。最后给出了动物叫声模拟器的实现思路,强调通过接口封装使行为可独立变更。策略模式的核心价值在于将可变行为抽象化,实现运行时灵活切换。
2025-06-17 21:14:07
418
原创 从C++编程入手设计模式——外观模式
本文介绍了C++中的外观设计模式。外观模式通过提供一个统一接口来封装复杂子系统的调用顺序和协作方式,从而简化客户端使用。文中以家庭影院系统为例,说明如何用外观模式封装多个设备的操作流程。该模式适用于需要简化复杂子系统调用、实现系统分层和解耦的场景。作者提供了相关代码示例并分享在GitHub仓库中,适用于C++20及以上版本的设计模式实践。
2025-06-17 20:43:03
557
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人