- 博客(151)
- 收藏
- 关注

原创 【Linux线程】之线程同步与生产消费模型
*条件变量(Condition Variable)**是一种线程同步的机制,它允许线程在满足某些条件时被等待或通知。我们举个例子来理解条件变量:条件变量本身并不提供对共享资源的保护,它只是一种机制,用于协调特定条件下线程的等待与通知,而互斥锁则确保多个线程访问共享资源时的互斥性,避免竞争条件和数据不一致的问题。所以我们在使用条件变量时,需要自己手动传互斥锁,来保护共享资源,避免因为多线程并发访问,造成数据不一致等问题。是线程库中表示条件变量的抽象类型和(锁的抽象类型)、pthread_t。
2024-12-29 15:47:48
992
1

原创 【Linux学习工具篇】之apt的使用及apt镜像源的配置(保姆级教程)
上篇博客,我们介绍了关于Linux权限的相关知识,今天这篇博客我们继续介绍Linux系统中常用的几大工具,基于Ubuntu 22.04.4LTS。
2024-10-24 16:12:08
4828
原创 MySQL事务介绍
事务是MySQL中的多个(或一个)sql语句。如果这些语句都被成功执行,并且成功提交后,将会永久更改数据;否则将会Rollback(回滚到之前的版本)。事务的四大属性原子性 (Atomicity):原子性确保事务是一个不可分割的工作单位;事务中的操作要么全部完成,要么全部不执行,不存在部分完成的情况。如果事务过程中遇到错误,系统会自动回滚到事务开始前的状态。一致性 (Consistency):一致性保证了事务必须将数据库从一种一致状态转换为另一种一致状态。
2025-07-09 23:55:42
1035
原创 【实习篇】之Http头部字段之Disposition介绍
本文介绍了HTTP头部字段Content-Disposition的作用及其相关RFC规范。该字段控制客户端如何处理服务器返回的内容,如直接显示或强制下载文件。文章重点解析了RFC 6266(HTTP中Content-Disposition的标准)、RFC 5987(非ASCII文件名编码方案)和RFC 2047(MIME邮件头非ASCII字符编码)三个核心规范,并对比了不同协议下中文文件名的处理方式。最后建议参考Google浏览器源码实现多协议兼容,为开发中遇到的下载兼容性问题提供了解决方案。
2025-07-09 23:46:55
731
原创 【深入浅出MySQL】之数据类型介绍
我们从实际的现象来观察并思考为什么会这样。创建表tt9居然!num1被近似成了,而且总长度是11位,我们不是规定了总长度吗?这个num2是正常显示的。我们手动插入一下一行让num1为很明显失败了,MySQL报错了。总结FLOAT是近似类型:它不保证精确存储和显示,可能会对大数值进行近似处理。DECIMAL是精确类型:它严格按照定义的范围和精度存储和显示数据。
2025-05-04 23:09:28
1313
原创 【掌握 DDL】:SQL 中的数据库与表管理
是 SQL 的一个子集,用于定义和管理数据库结构,包括数据库和表。本文详细介绍了用于创建、查看、修改和删除数据库及表的基本 DDL 命令,附带实用示例和最佳实践。
2025-05-03 23:12:42
1982
5
原创 【深入浅出Linux网络编程】之数据链路层
数据链路层是TCP/IP五层协议和OSI七层协议中的倒数第二层,它主要负责在同一局域网之间的节点间进行可靠的数据帧的传输。注意:在网络中我们将主机可以称之为节点。以太网是局域网技术的一种,常见的局域网技术还有令牌环网技术、WIFI技术(无线局域网)。以太网是最流行的局域网技术,使用物理电缆(如双绞线或光纤)连接网络设备。它支持从10Mbps到100Gbps及以上的传输速率。
2025-05-03 22:56:52
785
原创 【Linux深入浅出】之全连接队列及抓包介绍
全连接队列就是我们内核(传输层)中某个结构体中维护的一个队列,每一个listen套接字都有一个全连接队列:在Linux内核中所谓的连接和全连接队列都是struct结构体,后面我们会结合Linux内核重点介绍。注意:全连接队列的大小并不是代表TcpServer服务器只能同时处理这么多,而是表示它来不及处理(来不及调用accept)的连接的最大数量。结构体是我们网络socket的入口,它是一个通用的套接字类型。short type:它是一个保存各种函数方法的类型,可以通过type。
2025-05-02 23:16:52
928
原创 【网络层】之IP协议
4位版本:标识你使用的IP协议是IPv4还是IPv6。4位首部长度:和TCP协议中的手表长度一样也有基本单位,基本单位为四字节,存储IP报文报头的长度(包括选项)。16位总长度:存储整个IP报文的长度。8位生存时间:TTL的主要作用是限制数据包在网络中的存活时间或经过的路由器跳数,以防止数据包在网络中无限循环。因为路由器在网络中是可能出现bug。
2025-05-02 23:14:46
736
原创 【MySQL从入门到精通】之基础概念详解
数据库是按照特定结构组织、存储和管理数据的一套系统,通常存储在内存或磁盘中。关系型数据库:适合结构化数据和强一致性场景,如金融系统。NoSQL 数据库:适合半结构化数据和高扩展性需求,如社交网络。云原生数据库:适合弹性扩展、免运维的云上应用。NewSQL 数据库:结合 SQL 和 NoSQL 优势,适合分布式混合负载。应用层:提供客户端、API 等与 MySQL 交互的方式。查询处理器:解析、优化和执行 SQL 语句。存储引擎层:管理数据的存储和访问方式。数据存储层:负责数据持久化和高效存取。
2025-04-12 00:24:02
867
原创 【深入浅出 Git】:从入门到精通
Git 是一种分布式版本控制系统,帮助开发者高效管理文件的不同版本。无论是代码、配置文件,还是其他文本文件,Git 都能追踪其变更历史,尤其在程序开发中不可或缺。Git 是一个功能强大且灵活的工具,掌握其核心操作能极大提升开发效率。本文从安装、基本操作到分支管理和远程协作,全面介绍了 Git 的使用方法。善用暂存区:精细控制提交内容。规范提交信息:清晰记录每次变更。谨慎操作:如和强制推送。实践为王:通过实际项目加深理解。试一试。
2025-04-12 00:02:34
1802
原创 分布式在线评测系统
一般的在线oj平台给每道题都会设置超时时间和内存上限值,但是可能不会展示给用户,这两个功能我们的项目中也有体现,只需要调用系统调用就可以设置程序执行的最大时间和使用内存,如果一但超过这个值,OS就会给进程发送信号,终止它。打开输入、输出、错误等临时文件放在主进程中,是为了给上层报告错误,如果放在子进程中,不好返回,放在主进程中,这样子进程就只会出现运行错误了,会返回信号码(一般程序替换不会执行失败,除非参数错误,这些我们
2025-03-20 22:31:17
1065
原创 PCRE2 站内搜索引擎项目
项目所用技术栈:STL。准标准库库。Jsoncpp库。cppjieba库。cpp-httplib库。多线程/多路复用。html5,css,js、jQuery、Ajax。ICU库。项目开发环境:在学习PCRE2 (Perl Compatible Regular Expressions 2)这个库时,去官网查阅文档,发现没有站内搜索功能:正好它提供了下载源码的功能,源码中有文档对应的文件,我决定给它做一个站内搜索的功能。中是一个目录,然后这个目录中就是我们网站对应的各种文件:我们想做一个类似百度搜索引擎的效果,
2025-03-20 22:22:36
1325
原创 【网络编程】之TCP实现客户端远程控制服务器端及断线重连
这是一条预处理指令,是Microsoft Visual C++ 编译器MSVC的扩展指令,它的功能和gcc/g++中的-l选项类似,可以告诉编译器要链接的库的名称。MSVC(Microsoft Visual C++)是由微软开发的一款集成开发环境(IDE)和编译器工具套件,用于开发基于CC++和C++/CLI的应用程序。
2025-03-03 20:51:34
1216
原创 【网络编程】之TCP通信步骤
函数功能:返回当前套接字bind的地址。参数int sockfd:要查看bind地址的套接字描述符。:输出型参数,该函数会把地址写进这个变量指向的空间中。:指向保存结构体大小变量的指针,输入型参数。返回值:成功0被返回。否则-1被返回,errno被设置。头文件。
2025-03-03 20:48:15
1129
原创 应用层之HTTPS协议简单介绍
加密就是将原本在网络中明文传输的数据,通过某种加密算法,将明文数据变成不能被人类直接识别的密文的行为。解密就是通过密钥和加密算法,将从服务器端获取到的数据解析为可识别的数据的行为。加密和解密的事情也不用我们去做,在应用层已经有很成熟的TTLSSL等用于数据加密的协议。TLS(Transport Layer Security,传输层安全性协议)和 SSL(Secure Sockets Layer,安全套接层)是用于在网络通信中提供加密和安全性保障的协议。
2025-03-03 20:43:31
781
原创 【网络编程】之数据链路层
数据链路层是TCP/IP五层协议和OSI七层协议中的倒数第二层,它主要负责在同一局域网之间的节点间进行可靠的数据帧的传输。注意:在网络中我们将主机可以称之为节点。以太网是局域网技术的一种,常见的局域网技术还有令牌环网技术、WIFI技术(无线局域网)。以太网是最流行的局域网技术,使用物理电缆(如双绞线或光纤)连接网络设备。它支持从10Mbps到100Gbps及以上的传输速率。
2025-02-17 22:40:23
865
原创 【网络编程】之NAT技术与代理
NAT技术是当代路由器的核心功能,它主要负责在进行网络通信时,将内网中的主机的源IP地址(私网IP)与当前路由器的WAN口的IP地址不断替换,直到这个IP地址变成公网IP,简单点说,NAT技术就是将内网IP在对外进行网络通信时将其转化为公网IP、而当报文想要发送给内网中的主机时又将公网IP转化为内网IP的技术。NAT转化过程:当路由器收到来自服务器A的数据时,又会把目标IP地址从转化为10.0.0.2为什么内网中可能有很多主机,路由器能准确的直到应该将数据帧中的IP报文的目的IP替换为哪一个主机的内网。
2025-02-17 22:38:19
1049
原创 【网络编程】之TCP协议
TCP报文是有类型的,因为TCP通信需要建立连接,所以就肯定有建立连接的报文、关闭连接的报文以及正常通信的报文,这些报文不同类型用什么标 识呢?它们肯定要体现在TCP的报头中,以OS的角度来看,OS只需要设置不同的比特位为1即可。下面我们将介绍PSH标志位、URGPSH指示接收方尽快将数据交付给上层应用程序,而无需等待接收缓冲区满:当接收缓冲区有数据时,OS并不会马上通知上层,而是等待缓冲区满或者有更多数据,当设置了这个标志位,就可以立即通知上层。URG标志位:用来标识报文中有紧急数据,当URG。
2025-02-14 13:47:27
898
原创 【网络编程】之Udp网络通信步骤
函数功能:返回当前套接字bind的地址。参数int sockfd:要查看bind地址的套接字描述符。:输出型参数,该函数会把地址写进这个变量指向的空间中。:指向保存结构体大小变量的指针,输入型参数。返回值:成功0被返回。否则-1被返回,errno被设置。头文件。
2025-02-13 22:16:23
1624
原创 【网络编程】之Udp通信小demo
客户端输入一个英文单词发送给服务器,服务器返回该单词的中文意思给客户端,如果没有则返回NOT FOUND。使用多线程处理翻译任务。可以支持多个客户端同时通信,服务器端负责消息的转发,具体如下图所示:细节:服务器端接受到客户端发来的信息,需要将它的地址信息(IP和端口号)新增,新增的前提是没有保存过。因为只有客户端向服务器发送过请求,服务器才能知道客户端的地址信息,只有知道地址信息了,才能将消息转发。
2025-02-13 22:11:25
1198
原创 【网络通信】传输层之UDP协议
虽然UDP是不可靠的,但是还是提供了简单的数据校验的方法,通常这个校验和的计算是有一个固定的方式的(与此次通信的协议中的字段相关),通过计算填充到这个字段中,通过网络传输后再次计算,如果两次结果不同就证明传输过程中出现了问题。假设此时你在给你的朋友写信,信写完后会通过快递员运输,虽然可能你的信件会经过很多地方,但是这些地方都不会关注你的信件的具体内容(它只有到你朋友这里才会被拆封),最终信件到你朋友这里,的都是这里面的端口号,由于这些端口是动态分配的,因此不应该长期固定地分配给任何特定的服务。
2025-02-13 22:07:24
1068
原创 【Linux网络编程】之配置阿里云安全组
在Linux中,防火墙是一种网络安全机制,用于控制网络流量的进出。它通过一组规则(称为防火墙规则)来决定哪些网络流量可以进入或离开系统,哪些流量应被拒绝或限制。防火墙的核心目的是防止恶意攻击、网络入侵,以及控制系统的网络通信。安装firewalld。启动和启用firewalld服务。# 启动 firewalld 服务 sudo systemctl start firewalld # 设置 firewalld 开机自启动 sudo systemctl enable firewalld检查firewalld。
2025-02-07 19:49:44
2046
原创 【Linux网络编程】之守护进程
组长进程就是进程组中的第一个创建的进程(按照时间),如果这个进程组中就只有一个进程,那么它就是进程组中的组长。
2025-02-07 19:45:16
1288
原创 【网络编程】之应用层协议http Session技术介绍
Http Session介绍Session的定义Session技术的原理代码验证Session技术http.hppSession技术的不足之处前言:上接博客,这篇博客将介绍Cookie技术的更新方案Session。Session是一种会话保持技术,它和cookie技术的区别是,cookie技术将数据存储在客户端,容易直接泄漏用户的数据,而Session技术则是将用户的数据存储在服务器中,不易泄漏数据。
2025-02-05 21:36:51
1212
原创 【网络编程】之http协议Cookie
无状态:指的是httpserver不会记住之前与特定客户端的交互细节,保存与它相关的任何会话状态(比如登录状态),再次刷新又是一个独立的请求,需要提供之前需要的信息。(这个信息可以由用户手动提供,也可以是浏览器客户端提供)无连接:准确的来讲是叫无持续连接,因为http底层是tcp,但是每一次发送请求给httpserverhttpserver发送响应报文后,这次连接就关闭了,再次发起请求会建立一个新的连接,所以是无持续连接。Cookie。
2025-02-05 21:29:30
1048
原创 【Linux网络编程】之UDP网络通信
这个库是Windows系统中的网络库,这个库不在内核,而是在用户层,需要用户初始化。Linux不需要像Windows一样初始化网络库(如WSAStartup),因为其网络协议栈是内核的一部分,操作系统启动时自动加载和初始化。函数功能:这个函数用于初始化Windows下的网络库Winsock库,只有正确初始化了这个库,我们才能使用网络库中的一些函数。将网络库加载进内存:并映射到当前进程的虚拟地址空间中,并准备好用于网络通信的资源。版本管理。
2025-02-04 16:42:36
923
原创 【Linux网络编程】之应用层http协议介绍
http协议介绍URL基本概念URL组成URL示例urlencode和urldecodehttp请求与响应http请求http响应请求方法GETPOSTPUTPATCHDELETEHEADOPTIONSweb根目录HTTP状态码http版本demo代码Http.hpp相关类介绍代码实现服务器程序主函数Socket.hpp运行结果虽然TCP/IP协议中,应用层协议是程序猿自己写的,但是随着发展,有那么几种应用层协议是我们经常使用的,所以就有大佬将其写出来并开源了,http协议就是其中一种。http协议。
2025-02-04 16:37:33
946
原创 Udp与Tcp Soket编程API介绍
SocketAPI介绍Socket的概念Socket的分类API介绍socketstruct socket结构体再谈文件描述符bind将数据转换为网络字节序的函数inet_pton和inet_ntop函数listenacceptconnect发送数据(send、sendto)接收数据(recv、recvfrom)close--清理资源Soket是应用层和传输层之间的中间抽象层。它将应用层和网络协议栈连接起来,使得开发者可以调用简单的API实现复杂的网络通信。功能:创建一个Socket描述符(文件描述符)。
2025-01-25 19:37:09
601
原创 【Linux网络编程】之应用层序列化与反序列化
我们并不准备自己实现序列化和反序列化的过程,而是使用成熟的Jsoncpp库,这样可以减少我们开发的时间。Jsoncpp解析JSON字符串Jsoncpp提供将JSON数据转化为C++对象的功能。生成JSON字符串。Jsoncpp库提供将C++对象转化为JSON数据的功能。支持 JSON 的基本类型:JsonCpp 支持常见的 JSON 类型,包括对象()、数组(JSON Array)、字符串、数字、布尔值和null。Jsoncpp:是JsonCpp库的主要数据类型,用于表示JSON对象。
2025-01-25 19:27:21
1058
原创 【Linux线程】之日志
在写日志相关的函数时,我们可能会使用到可变参数。可变参数是通过省略号...来表示的。这三个点(...)表示函数可以接收一个不定数量和类型的参数。简单介绍一下可变参数,我们学习了C语言不陌生,printf和scanfformat是一个字符串,但它是用来指定参数类型和输出样式的。可变参数:根据format中的格式说明符,printf可以接收多种类型的参数。在C语言中,一般情况下,const char *format和...是绑定在一起的,其中format。
2025-01-03 17:22:37
892
原创 【Linux线程】之线程池
线程池是一种管理和复用线程资源的设计模式。它通过创建和维护一批线程来执行任务,从而避免频繁的线程创建和销毁开销。线程池的核心思想是将线程视作一种可复用的资源,为需要执行的任务提供线程支持。
2024-12-31 19:14:19
1313
原创 【DS高阶】之红黑树
在上篇博客中,我们谈到了AVL树,今天来让我们学习一下另外一种平衡二叉树–红黑树,阅读完本篇博客,你将对红黑树的原理实现有更加深刻的理解,另外,博客如有错误,欢迎大家在评论区斧正。
2024-12-31 19:13:45
1029
原创 【C++STL】之unordered_map与unordered_set系列容器的使用
这个类对象的前两个模板参数我们都很熟悉,Key值和Value值的元素类型。第三个是哈希函数:因为我们要将Key转化成一个索引(整数),但是这个key值的类型不一定是整数,就需要我们使用特定的哈希函数去转化为整数,这个整数可能不符合数组的下标范围,需要我们继续处理,这个我们后面具体谈到哈希再说。第三个模板参数是一个仿函数类,如果两个值相等,就返回true这个和map除了底层不一样,其它都很相似。unordered_set和unordered_map的唯一区别就是前者只有Key没有Value。
2024-12-31 19:13:16
798
原创 【C++STL】之unordered_map和unordered_set的封装
上篇博客中,我们模拟实现了拉链法处理冲突的哈希表和线性探测处理冲突的哈希表,在本篇博客中,我们将基于拉链法处理冲突的版本来模拟封装一下容器。
2024-12-31 19:12:50
618
原创 【C++STL】之map和set容器的使用
官方文档上述文档主要介绍了以下几点:1、map的模板参数主要有四个,Key是键的类型,T是Value的类型,第三个模板参数是一个比较器,一般可不传,默认是C++库里面的less(小于返回真)类型,默认情况map是升序,这里我们要模拟实现map后才能更好的理解。2、map里面的键值对(Key-Value)在内部是一个类型:3、map是关联式的容器,内部按照键元素有序排列,并且内部的键是独一无二的,并有其对应的Valuemap还可通过[Key]来访问Key对应的Value值。set。
2024-12-30 23:15:49
755
原创 【Linux线程】之生产者消费者模型高并发版本
虚假唤醒是多线程编程中可能发生的一种异常,虽然它并不常见。但我们必须使用while循环来防范,这样可以有效避免因为虚假唤醒而造成对程序运行逻辑的破坏。我们可以使用上一篇博客阻塞队列的pop// 获取互斥锁,确保对队列的访问是线程安全的// 如果队列为空,消费者等待if(!cnt)std::cerr
2024-12-30 22:46:57
896
原创 【DS】之哈希表及其模拟实现(二)
由于我们用拉链法处理冲突,所以需要一个类似单链表的类型,也可以使用库里面的`List`,这里我们使用自己实现的单链表,更好调试。
2024-12-29 22:28:34
712
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人