- 博客(78)
- 收藏
- 关注
原创 Qt从入门到放弃学习之路(1)
Qt是一个跨平台的GUI开发框架,支持Windows、Linux、Mac等主流系统。它被广泛应用于Steam、Chrome、QQ等知名软件的开发。使用Qt开发时,推荐通过官网安装器下载QtCreator和MSVC编译器,新手建议选择稳定的Qt5.15版本。创建项目后,可以通过qDebug()函数输出;快速验证开发环境是否搭建成功。Qt提供可视化界面设计工具,简化了GUI程序的开发流程。
2025-10-27 22:23:54
1118
原创 一个程序如何连接数据库?以C++为例
本文详细介绍了如何使用MySQL和C++构建用户管理系统。首先讲解了如何创建数据库(testSQL)和用户(test),并赋予权限。然后演示了在C++中连接MySQL数据库,包括初始化、连接和基本操作(增删改查)。重点说明了查询操作的实现方法,包括获取结果集、行数列数、属性行和内容行等关键步骤。文中提供了完整的代码示例,展示了如何通过C++程序对用户表(users)进行数据操作,最后总结了主要接口的使用方法。整个过程涵盖了数据库创建、权限管理到程序连接操作的全流程。
2025-09-30 14:08:21
883
原创 测试用例全解析:从入门到精通(1)
本文介绍了软件测试中测试用例的核心概念与设计方法。首先通过生活案例解释测试用例的本质,即通过多种场景验证系统行为的集合。重点阐述了测试用例设计万能公式(功能、性能、界面、兼容、易用、安全测试)及其应用示范。随后详解四种测试用例设计方法:等价类划分(有效/无效输入)、边界值分析(临界值测试)、场景法(主流程与异常路径)和正交法(组合优化)。特别展示了如何用正交表工具高效生成组合测试用例。文章强调好的测试用例应追求更高覆盖率而非数量,为测试人员提供了系统化的用例设计思路和实用工具方法。
2025-09-12 17:02:52
849
原创 软件测试小结(1)
本文介绍了软件测试的基本概念、与开发的区别、测试人员素质要求、需求分析及开发模型。主要内容包括:1.测试定义与重要性,如用户需求验证;2.测试开发与软件开发的区别,强调测试工具开发而非业务代码;3.测试人员需具备的9项核心素质,如沟通、学习、开发能力等;4.用户需求与软件需求的转化过程;5.四种开发模型(瀑布、螺旋、增量、迭代)的特点及适用场景。文章系统梳理了软件测试的关键知识点,为测试工作提供了实用指导。
2025-09-02 21:56:21
546
原创 Mysql基本语句(二)
emp表:dept表:salgrade表:注意这里的年薪等于12个月工资加上年终奖注意这里的format用来保留小数点后两位,group by为分组查询注意这里having的用法,通常跟group by一起使用,用来对查询后的结果进行筛选注意这里需要用到部门信息表dept和员工信息表emp,需要两张表进行笛卡尔积注意这里需要用到员工表emp和工资级别表salgrade,需要将两个表进行笛卡尔积注意这里要先找出FORD的上级领导,括号里的为子查询注意
2025-08-29 17:16:29
373
原创 Mysql基本使用语句(一)
这篇文章介绍了MySQL数据库的基本操作,包括数据库创建、表的增删改查以及约束设置。主要内容有:1)登录MySQL并创建数据库和表;2)对表进行增加、修改、删除列和行数据等操作;3)表的约束设置,包括主键、唯一键、外键等约束条件及其应用场景。文章通过具体SQL语句演示了各种操作,并解释了主键与外键的关系,强调了表与表之间的关联约束。最后还说明了外键约束下数据操作的注意事项。
2025-08-14 22:37:59
1219
原创 一条URL从浏览器输入后...
URL(统一资源定位符)是网页地址,包含协议、域名/IP、端口和资源路径。HTTP协议作为应用层协议,负责浏览器与服务器间的通信,通过GET/POST方法实现资源获取和上传。GET通过URL传参,POST通过正文传参。服务器通过CGI机制处理请求,由外部程序完成计算后返回结果。从输入URL到获取资源的过程涉及DNS解析、TCP三次握手、数据封装传输及服务器处理响应等步骤,最终浏览器展示结果或完成上传操作。
2025-08-04 00:50:42
678
原创 Linux下的七层网络模型之数据链路层的深入理解
摘要:本文介绍了数据链路层的核心概念,重点讲解了局域网通信机制。数据链路层负责主机间的数据传输,通过MAC地址识别设备。文章详细阐述了局域网通信过程、数据碰撞问题及交换机的作用,解析了MAC帧结构和ARP协议工作原理。其中,ARP协议用于在局域网内获取目标主机的MAC地址,通过广播请求和单播应答的方式完成地址解析。文中还对比了IP地址(全网定位)和MAC地址(局域网定位)的区别,并图示说明了ARP请求/应答的全过程。
2025-07-23 00:32:14
993
原创 IP协议深入理解
IP协议是网络层核心协议,负责跨网络实现主机A到主机B的数据传输。IP地址由网络号和主机号组成,通过路由器进行转发。IP报头包含版本、首部长度、服务类型等字段,实现数据分片和路由选择。路由器作为网络中转站,连接不同子网并实现DHCP地址分配。为解决IP地址不足问题,采用CIDR划分子网、NAT技术和IPv6扩展。私有IP通过路由器NAT转换访问公网,形成层次化网络结构。理解IP协议和路由器工作原理对网络通信至关重要。
2025-07-18 22:37:16
1339
2
原创 TCP传输控制层协议深入理解
本文深入解析TCP传输控制协议的核心机制。首先介绍了TCP的基本概念和工作原理,包括全双工通信、缓冲区管理和数据传输流程。其次详细解读了TCP报头格式,重点分析了端口号、序号、确认序号、标志位等关键字段的作用。文章还系统阐述了TCP的可靠性策略(超时重传、流量控制、拥塞控制)和性能优化技术(滑动窗口、快速重传、延迟应答)。特别探讨了三次握手和四次挥手的连接管理机制,以及面向字节流特性带来的粘包问题及其解决方案。最后总结了TCP在网络通信中确保可靠传输和提高效率的各种策略,为理解TCP协议提供了全面的技术视角
2025-07-10 21:43:01
1129
原创 HTTPS加密原理
HTTPS安全通信机制解析 HTTPS通过加密层保障HTTP数据传输安全,采用对称加密(高效)与非对称加密(安全)相结合的方案。初始方案存在安全隐患后,引入CA机构颁发的数字证书进行身份认证。证书包含服务器公钥、数字签名等信息,客户端通过CA公钥验证证书真伪。最终方案为:非对称加密交换密钥+对称加密传输数据+证书认证,有效防范中间人攻击。该机制虽成熟但仍持续优化,无法保证绝对安全。 (摘要完整呈现HTTPS核心原理:加密方式演变、证书验证流程及安全方案,字数控制在150字以内)
2025-06-20 22:40:59
1386
原创 Linux --TCP协议实现简单的网络通信(中英翻译)
本文介绍了TCP协议及基于TCP协议的服务端与客户端实现方案。服务端采用线程池处理并发请求,实现英文字典翻译功能;客户端具备断线重连机制。重点内容包括:1) TCP服务端搭建流程(套接字创建、绑定、监听);2)自定义线程池设计,实现任务队列管理;3)守护进程实现服务后台运行;4)客户端包含自动重连功能;5)字典翻译服务模块实现。系统设计强调可靠性、并发处理能力和断线恢复能力,通过Makefile编译后即可实现7x24小时持续服务。
2025-06-02 23:24:27
795
原创 Linux --UDP套接字实现简单的网络聊天室
本文介绍了基于UDP协议的客户端-服务器通信系统的实现。服务器端通过创建套接字、绑定端口、接收消息并广播给所有在线用户;客户端创建套接字后,使用两个线程分别处理消息发送和接收。系统支持用户登录检测和消息转发功能,并通过本地和跨平台测试验证了功能。文中提供了完整的C++实现代码,包括服务器端(UdpServer类)、客户端(ThreadData结构)以及Makefile编译文件。该系统实现了基本的UDP网络通信功能,可作为即时通讯应用的底层框架。
2025-05-31 01:32:25
704
原创 LINUX 线程(下)
本文介绍了两种生产者-消费者模型的实现方法。首先分析了生产者-消费者模型的基本概念,包括三种关系(生产者间互斥、生产消费者间互斥与同步、消费者间互斥)、两种角色和共享内存这一交易场所。然后详细讲解了基于阻塞队列的实现方式,通过互斥锁和条件变量确保线程安全,并给出了完整的C++代码实现。接着介绍了基于环形队列的优化方案,利用信号量管理资源数量,实现了更高效的数据存取。两种方法都通过实际代码演示了生产者线程生成计算任务、消费者线程处理任务的完整流程。文章最后提供了对应的Makefile编译指令和运行结果说明,为
2025-05-27 13:21:21
418
原创 Linux 线程(中)
本文主要探讨了线程的局部存储、多线程并发访问共享资源带来的问题及其解决方法。首先,通过代码示例展示了线程具有独立的栈空间,而全局变量在未使用__thread修饰时是共享的,使用后则每个线程独有一份。接着,文章指出了多线程并发访问共享资源可能导致的数据不一致问题,并介绍了通过互斥锁来解决这一问题的方法,包括锁的初始化、销毁、上锁和释放锁的接口及其使用。此外,文章还讨论了互斥与同步的概念,以及如何通过条件变量来实现线程的同步,避免线程饥饿问题。最后,文章简要介绍了锁的原理、死锁的概念及其四个必要条件,并提出了解
2025-05-22 11:17:42
1259
原创 Linux 线程(上)
本文深入探讨了Linux系统下的线程概念及其管理机制。首先,文章通过图解方式重新解释了进程和线程的关系,指出进程是系统资源分配的基本单位,而线程是CPU调度的基本单位。接着,文章介绍了pthread库的使用,包括如何创建、等待和批量创建线程,并详细解释了pthread_t tid、LWP和PID之间的关系。此外,文章还讨论了线程的分离、退出和取消等控制操作,以及线程的特点和优势。最后,文章总结了线程在系统调度、资源占用和通信速度等方面的特性,强调了多线程编程的高效性和适用场景。通过本文,读者可以更全面地理解
2025-05-18 20:51:32
964
原创 Linux 信号终篇(总结)
本文详细介绍了Linux系统中信号从产生到处理的全过程。首先,信号可以通过键盘组合键、Linux命令、系统调用、异常和软件条件等五种方式产生。其次,信号的保存通过三张表实现:block表记录信号是否被屏蔽,pending表记录信号是否已产生但未处理,handler表保存信号处理方法。接着,信号捕捉通过signal和sigaction接口实现,并讨论了可重入函数和volatile关键字的作用。最后,介绍了基于信号方式的进程等待,包括子进程退出时发送信号给父进程,以及通过循环非阻塞轮询或忽略信号自动回收子进程。
2025-05-10 21:55:08
1115
原创 Linux 信号(下篇)
①核心转储功能,用来当进程出错的时候把运行时的出错信息保存在程序当前目录下,文件名为core.pid;②当以后调试的时候直接打开core文件就可以快速定位到出错的那一行代码;③为什么服务器要把core dump功能关掉?因为:如果不关掉,一旦进程出现异常终止后就会在进程的当前目录下创建core文件并保存其运行时的信息;不要忘记了当程序异常的时候OS并没有直接把它杀死掉,而是让用户自己决定,如果用户没有让进程结束,cpu会一直调度这个进程并一直出异常并一直创建core文件在其当前目录下!
2025-05-07 22:24:42
972
原创 Linux 信号
在linux中,一次登陆,一个终端一般会配上一个bash,每一个登陆只允许一个进程是前台进程,可以运行多个进程是后台进程,谁是前台谁是后台取决于谁来获取键盘输入,能获取的就是前台进程;//1. 这个接口的作用是获取信号,并且修改信号的处理方式//2. sighandler_t 这是一个函数指针类型,函数的返回值为void,函数参数类型为int//3. sigbum为接收到的信号数字,handeler : 你需要传入一个已经定义好的方法①:只要设置一次,往后都有效;
2025-05-02 22:31:10
786
原创 Linux -- SysremV 共享内存通信
①:第一步进程A向物理内存中申请创建一块资源空间;②:第二步申请成功后把这块内存对应的虚拟地址挂载到进程A的地址空间中;③:第三步进程B向物理内存中获取进程A已创建好的资源,④:进程B获取成功后,把对应的虚拟地址挂载到进程B的地址空间中;⑤以上步骤实现完就已经建立了⑥:通信结束后进程A取消对这块共享内存的关联,进程B也取消对这块共享内存的关联;⑦:最后一步:谁把这块共享内存创建出来的谁就来释放,这里明显是进程A来创建的所以只需要进程A来释放,进程B啥事也不用做;
2025-04-30 15:21:40
1239
原创 Linux 命名管道+日志
例如:当程序运行发生错误时,这是一个Error消息,把错误信息的等级、发生时间、错误内容、错误码按照自己的需求打印出来(可以打印到屏幕或者某个文件,也可以根据日志等级把信息分类打印到不同的文件);进程A、B之间实现了通信,当写端关闭后B读到文件末尾返回值0退出循环;可以看到三条日志消息都分类打印到不同的文件中!运行B:(B在等待键盘输入,且A打印了一句):比较严重需要立即处理;运行A:(A进程在等待读)
2025-04-29 17:09:27
475
原创 Linux -- 利用管道实现一个简单的进程池
我们可以一次性创建一批子进程,然后父进程为每一个子进程之间建立一个管道通信,之后父进程就可以通过向创建好的管道里写入任务码,子进程通过向管道里读取任务码执行对应的任务!图解:此时我们就一次性创建了一批进程,当需要执行任务的时候直接让某个进程去执行,不需要每次使用的时候再去创建!此时父进程相当于master(主导读写操作),进程1、2、3、4、5为salver(只)!父进程通过对所有管道的管理实现对所有子进程的管理!
2025-04-26 12:27:53
518
原创 Linux 管道理解
①具有血缘关系的进程;②父子进程会协同,同步与互斥,---保护管道文件的数据安全;③管道只能单向通信;④管道是面向字节流的;⑤管道是基于文件的,而文件的生命周期是随进程的;
2025-04-23 23:38:44
1266
2
原创 Linux 动、静态库的实现
当我们写了一段代码实现了一个方法,如果我们不想把方法的实现过程暴露给别人看,可以把代码打包成一个库,其中形成后缀为.a的是静态库,后缀为.so的为动态库;当别人想使用你的方法时,把打包好的库跟头文件一起扔给他就行。
2025-04-20 22:52:19
1597
原创 C++ STL 关联式容器之二 map
Hello!!大家早上中午晚上好!!上一篇写到set的实现底层是对红黑树的套用,今天我们也来实现一下map吧!!
2025-04-16 13:05:03
341
原创 C++ STL-- 关联式容器之一 -- set
AVL树是一个平衡二叉搜索树,当向二叉搜索树中插入新节点后,如果能保证每个节点的左右子树高度之差的绝对值不超过1(需要对树中的节点进行调整),即可降低树的高度,从而减少平均搜索的长度;②为什么要用AVL树:因为二叉搜索树虽然可以降低查找效率,但如果数据有序或接近有序的时候将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下:例如:当数据是 1 2 3 4 5 6 ....13 14 时:二叉搜索树是这个样子:这样的搜索树高度很高,搜索次数会增加,效率大大下降!③怎么使用?怎么实现AVL树。
2025-04-13 11:34:25
632
原创 C++ STL简单的几个容器
Hello!!大家早上中午晚上好!!本文将介绍几个使用了适配器的容器的使用方法和模拟实现,例如:stack、queue、priority_queue!!
2025-04-02 23:33:09
528
原创 C++ List的模拟实现
/节点的定义(定义成模版可以接受各种类型)T _data;public:void emptyinit()//对空链表的初始化_size = 0;while (it!++_size;delete cur;--_size;
2025-03-30 17:42:55
483
原创 C++ Vector的模拟实现
需要注意迭代器失效的问题,当扩容的时候,资源已经转移到另一块空间pos指向的位置也要跟着改变;!!!咱下期见!!!
2025-03-24 13:08:34
523
原创 C++ STL序列式容器之二 - - Vector
vector是可以改变大小的数组;明确数组:同一类型的元素的集合;明确可改变大小:当你存储数据时,会根据你存储的内容改变数组大小,也就是会自动扩容;总结:vector是会自动扩容的同一类型的元素的集合!
2025-03-22 16:23:19
1014
原创 C++ STL序列式容器之一 string
普通对象可对最后一个字符进行访问和修改操作;对const对象只能访问;int main()//报错return 0;跟back的操作类似;int main()//普通对象return 0;int main()//const对象//报错return 0;
2025-03-19 17:36:28
843
原创 C++ 类型转换
注意 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是 否还有其他不同的方法达到同一目的,如果R非强制类型转换不可,则应限制强制转换值的作用 域,以减少发生错误的机会。强烈建议:避免使用强制类型转换!三、RTTI(了解)3.1、
2025-03-18 17:25:41
997
原创 C++11 lambda表达式、包装器、Bind绑定
捕捉列表](参数列表)->返回值{函数体};捕捉列表:捕捉上下文的变量供lambda函数使用可省略;参数列表:与普通函数的参数列表一样,如果没有可省略;->:可省略;返回值:如果为空或已确定返回类型,可省略;函数体:如果没有要写的也可省略;最简洁的lambda表达式: []{};包装器是函数适配器,用来包装可调用对象,包装器实质是一个模版:包装器的头文件: <functional>其中Ret是返回类型,Args...是可变参数;
2025-03-17 22:25:06
505
原创 C++11 emplace_back和push_back区别
Hello!!大家早上中午晚上好!!今天我们来看看emplace_back到底是什么?
2025-03-16 17:40:43
729
原创 C++11 右值引用和移动语义(2)
1、万能引用只存在模版,当在模版里设置参数为&&时代表的不是右值引用,而是既可以接收左值也可以接受右值:(如果传进来是右值它就是右值引用,如果传进来是左值它就会发生引用折叠变成左值引用);2、万能引用+引用折叠=完美转发的产生!!这些条件缺一不可!3、完美转发的作用是让参数保持它传入进来前的属性!!
2025-03-15 01:58:14
973
原创 C++11 右值引用和移动语义
可以取地址的值,赋值符号左边的值;return 0;不可以取地址的值,赋值符号右边的值;//报错return 0;左值引用就是给在左值取别名;int& b = a;return 0;a是左值,b给a区别名,b是a的左值引用;右值引用就是给右值取别名;(语法:&& )int main()int a = 10;return 0;
2025-03-14 01:03:03
722
原创 C++ 多态★★★★★★★
简单的来说,多态就是多种形态,不同的对象去完成某个行为会产生不同的状态;//一个简单的虚函数class Apublic:Fun1()就是一个虚函数,条件:被virtual修饰+必须在类内!重写也叫覆盖,重写必须是虚函数,只有虚函数才能被重写!虚函数的重写(覆盖):在子类中定义了一个跟基类完全一样的虚函数(即:函数名、参数列表、返回类型完全相同)public:virtual void Fun1()//三同:函数名、返回类型、参数列表此时我们称子类的Fun1()重写父类的Fun1();
2025-03-10 18:04:16
1089
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅