自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高等数学考研笔记

课件回顾

2024-01-14 13:39:29 2793

原创 Reactor反应堆

本文系统介绍了Linux下Reactor多线程模型的设计与实现,重点分析了事件驱动机制、线程唤醒方式和多进程扩展方案。核心内容包括:1. Reactor模式原理,基于epoll的I/O多路复用实现;2. 线程唤醒机制比较,包括FIFO管道和效率更高的eventfd方案;3. 多线程任务分配策略,包括主线程调度和子线程自举竞争模式;4. 多进程扩展方案,详解连接分配的三种实现方式及其适用场景。文章通过技术对比和典型应用场景分析,为开发高并发网络服务提供了实践指导,最后以Nginx多进程模型为例展示了React

2025-11-16 23:32:17 889

原创 五种 IO 模型与阻塞 IO

本文摘要: IO操作如同钓鱼过程,包含等待和拷贝两个阶段。文章详细介绍了五种IO模型:阻塞IO(默认方式)、非阻塞IO(需轮询检测)、信号驱动IO(SIGIO通知)、IO多路转接(select/poll/epoll)和异步IO(内核完成拷贝后通知)。重点探讨了select、poll和epoll三种多路复用技术的实现原理及优缺点:select使用位图监控fd但数量受限;poll通过结构体数组改进但仍需遍历;epoll采用红黑树和就绪链表实现高效事件通知。特别分析了epoll的ET/LT模式差异,强调ET模式必

2025-11-01 22:25:37 669

原创 NAT、代理服务、内网穿透

本文主要探讨了NAT技术和代理服务器的工作原理。NAT通过IP+端口映射解决IPv4地址不足问题,但会导致云服务器只能看到客户端公网IP。内网穿透需要借助云服务器交换双方公网信息建立连接。代理服务器分为正向和反向两种,反向代理常用于负载均衡和动静分离。最后指出FQ的核心原理是规避运营商限制。全文系统性地介绍了网络地址转换和代理服务的运行机制及实际应用场景。

2025-10-26 22:57:53 497

原创 数据链路层

数据链路层负责同一局域网内设备间的数据传输,通过MAC地址识别设备,而网络层则处理跨子网的IP数据包转发。以太网帧传输受MTU限制,大IP包需分片传输并重组,分片丢失会导致重组失败。局域网通信存在碰撞问题,连接设备越多性能越差。UDP和TCP协议都受MTU影响,TCP通过MSS优化传输效率。数据链路层的安全性需通过加密保障,防止抓包泄露。

2025-10-22 18:35:09 165

原创 网络层(IP)

本文介绍了网络层和IP协议的基本概念。网络层负责在复杂环境中确定传输路径,IP地址提供了跨网络传输数据的能力。IP协议定义了主机(配有IP地址但不路由)、路由器(配有IP地址并能路由)和节点(两者的统称)等概念。IP地址由网络号和主机号两部分组成,这种网段划分对网络管理至关重要。传输层则为IP的传输能力提供可靠性保障。

2025-10-17 22:12:28 257

原创 传输层协议 TCP

摘要:TCP协议通过4位首部长度字段控制数据包头部大小,范围20-60字节。必带的20字节固定首部对应0101二进制值。其核心机制采用序号和确认号双序号系统实现可靠传输,解决了仅用单序号可能导致的应答歧义问题。这种设计确保了数据有序性和传输可靠性,体现了TCP对数据传输的精细控制特性。

2025-09-26 23:36:50 350

原创 传输层协议 UDP

传输层通过端口号标识不同应用程序,端口号分为知名端口(0-1023)和动态端口(1024-65535)。UDP协议具有无连接、不可靠、面向数据报的特点,其首部包含16位长度字段,最大传输64K数据。UDP没有发送缓冲区,接收缓冲区不保证顺序,报文超过64K需应用层手动分片。一个进程可绑定多个端口,但一个端口不能被多个进程绑定。UDP报头与数据封装传输,通过端口号传递到应用层。

2025-09-21 16:20:12 855

原创 应用层协议 HTTP

HTTP是互联网中重要的应用层协议,定义了客户端与服务器之间的通信规则。URL作为统一资源定位器,包含协议、域名和端口等信息,特殊字符需通过urlencode转义处理。HTTP请求由请求行、报头和正文组成,使用/r/n换行符分隔,通过Content-Length标识正文长度。该协议采用无连接、无状态的通信方式,每次请求都需建立新连接,默认使用80端口。HTTP支持传输超文本内容,包括文本、图片、视频等多种数据类型。

2025-09-12 23:04:35 558

原创 应用层自定义协议与序列化

文章摘要:网络编程中,应用层协议通过字符串形式传输结构化数据。为解决跨平台兼容性问题,双方需约定统一的序列化/反序列化协议。Socket API的读写操作本质上是字符串交互,而TCP的全双工特性通过双缓冲区实现(每个文件描述符对应一个连接,包含输入/输出缓冲区),这解释了阻塞情况可能源于等待数据或缓冲区已满。协议的本质是规范化的数据转换约定。

2025-08-21 00:20:02 282

原创 Socket 编程 TCP

摘要:本文介绍了TCP网络程序实现英译汉功能的基本原理。TCP作为面向字节流的可靠传输协议,其操作类似于文件读写。文章详细讲解了socket API的关键函数:socket()创建套接字,bind()绑定固定地址和端口(成功返回0,失败-1),listen()监听连接,accept()返回服务客户端的文件描述符,以及connect()建立连接。重点说明了bind()函数的作用是将sockfd与myaddr绑定,使文件描述符监听指定地址和端口,并解释了sockaddr结构体的通用指针特性。

2025-08-17 23:31:44 377

原创 Socket 编程 UDP

本文实现了一个基于UDP的英译汉网络字典服务,包含日志系统、线程安全保护和回调机制。主要组件包括: 日志系统(Log.hpp):支持多级别日志(DEBUG/INFO/WARNING等),提供屏幕或文件输出选项,使用互斥锁保证线程安全 UDP服务器(UdpServer.hpp):封装socket通信,支持任意IP绑定(INADDR_ANY),利用回调函数实现业务逻辑解耦 字典功能(Dict.hpp):加载字典文件实现单词翻译,使用unordered_map存储键值对 客户端/服务器实现:客户端发送英文单词,服

2025-08-10 00:23:31 447

原创 线性代数考研笔记

1 3 2:逆序数为1 奇排列1 2 3:逆序数为0 偶排列将 1 3 2 只需将3 2交换1次就可以还原原排列,那么1 3 2可以直接判断是奇排列。

2025-01-03 19:12:09 1007

原创 Linux:网络基础概念

其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议。首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的。但是通过上面的简单例子,我们是能理解,分层可以实现解耦合,让软件维护的成本更低。

2024-08-20 23:22:54 688

原创 C++:IO流

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?1.使用itoa()函数2.使用sprintf()函数但是两个函数在转化时,都得。

2024-08-20 14:28:03 1038

原创 C++:C++的类型转换

在C语言中,如果C。1.隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2. 强制类型转化:需要用户自己处理3.没有关联类型是不支持转换的。

2024-08-16 14:04:00 534

原创 C++:特殊类设计

只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单,而且如果定义了就不会防止成员函数内部拷贝了。信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再。如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避。如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取。文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,比如在某个服务器程序中,该服务器的配置。

2024-08-16 13:13:25 524

原创 C++:智能指针

指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现 内存泄漏会导致响应越来越慢,最终卡死。工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。,就说明自己是最后一个使用该资源的对象,

2024-08-14 14:44:24 765

原创 C++:异常

抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的。不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层的调用。实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以捕获任意类型的异常,问题是不知道异常错误是什么。在您想要处理问题的地方,通过异常处理程序捕获异常。如果有一个块抛出一个异常,捕获异常的方法会使用。常,否则当有异常没捕获,程序就会直接终止。块中的代码被称为保护代码。

2024-07-23 14:48:05 821

原创 C++:C++11

前面涉及C++11的知识点我们补充讲解过,现在这篇博客我们正式讲解C++11。我尽量活成我想成为的模样,而不是某些人口中的‘他’。我们每个人都在跟自己的业力对抗,都想努力变好,可是这个世界本身就是矛盾的。愿吾之愿力能护持汝生生世世,不被世俗沉沦,看破诸法实相。

2024-06-10 23:13:59 1111

原创 Linux:多线程

如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以。

2024-06-02 00:54:34 944

原创 C++:哈希

中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中,注意:unordered_map中key是不能重复的,因此count函数的返回值最大为1。注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶。将key对应的value返回。

2024-05-20 16:00:26 1089

原创 Linux:进程信号

在bash上执行命令kill -l便可看到系统定义的所有信号我们只研究前31个信号,后面31个是实时信号这里不做研究每个信号都有一个编号和一个宏定义名称,这些宏定义都可以在signal.h中找到,在man手册中还可以找到各种信号的详细信息这里具体介绍了信号在什么时候产生,处理的动作是什么信号概念的基本储备信号:Linux系统提供的一种,向指定进程发送特定事件的方式,做识别和处理。信号产生是异步的。信号处理常见方式1、忽略该信号2、执行信号的默认处理动作(终止自己、暂停、忽略.....)

2024-05-09 01:32:29 1235 1

原创 C++:map和set类

map和set

2024-05-05 22:31:22 2174

原创 C++:二叉树进阶

从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。、最多查找高度次,走到到空,还没找到,这个值不存在。合并起来,因此真正的删除过程。,或者是具有以下性质的二叉树。看起来有待删除节点有。

2024-04-24 18:10:00 435

原创 C++:多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。必须通过基类的指针或者引用调用虚函数。多态的概念:通俗来说,就是多种形态,修饰的类成员函数称为虚函数。

2024-04-18 12:52:16 313

原创 Linux进程间通信

写端函数write系统接口函数write()函数的fd参数:是文件描述符,可以是套接字、文件等。write()函数的buf参数:是一个指向要读取数据的缓冲区的指针。write()函数的count参数:是要读取的字节数。write()函数的返回值:如果成功,返回读取字符的长度(可能为0,表示读到文件的结尾)如果时报,则返回-1,并设置errno表示读取失败的原因读端函数read系统接口函数read()函数的fd参数:是文件描述符,可以是套接字、文件等。

2024-04-17 21:49:44 546 1

原创 C++:继承

人一到群体中,智商就严重降低,人们为了获得群体的认同,愿意抛弃独立性去换取那份让人倍感安全的归属感。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。

2024-04-14 01:57:38 876

原创 C++:模板进阶

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

2024-04-12 23:56:07 503

原创 C++:stack类和queue类

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作push_back。

2024-04-07 11:27:50 891

原创 C++:list类

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;通常在任意位置进行插入、移除元素的执行效率更好。最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。来说这可能是一个重要的因素)个元素,必须从已知的位置。与其他的序列式容器相比。与其他序列式容器相比,

2024-03-30 01:11:13 758

原创 Linux基础IO

1.如果不存在,就在当前路径下新建指定的文件2.默认打开文件的时候,就会先把目标文件清空所以可以用来新建文件,清空文件,本质就是文件操作不会清空文件,本质就是文件操作类似PCB的结构体。

2024-03-28 01:07:06 737

原创 Linux进程控制

进程调用fork,当控制转移到内核中的fork代码后,内核做: 获取子进程status

2024-03-23 00:39:12 870

原创 C++:vector类

1. vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。

2024-03-13 17:30:24 2326 2

原创 C++:string类

1.字符串是表示字符序列的类2.标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。3. string类是使用char(即作为它的字符类型,使用它的默认和分配器类型关于模板的更多信 息,请参阅basic_string)。4. string类是模板类的一个实例,它使用char来实例化模板类,并用char_traits和allocator作为的默认参数根于更多的模板信息请参考。5.

2024-02-22 23:56:11 1071

原创 C++:STL简介

STL

2024-02-22 22:18:15 399

原创 Linux进程概念

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系截至目前,我们所认识的计算机,都是有一个个的硬件组件组成输入单元:包括键盘, 鼠标,扫描仪, 写板等中央处理器(CPU):含有运算器和控制器等输出单元:显示器,打印机等

2024-02-06 17:08:50 439

原创 C++:模板初阶

类模板实例化与函数模板实例化不同,隐式实例化和显式实例化。

2024-02-04 23:47:20 602

原创 C/C++内存管理

内置类型 如何避免内存泄漏1. 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。ps:这个理想状态。但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下一条智能指针来管理才有保证。2. 采用RAII思想或者智能指针来管理资源。3. 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。4. 出问题了使用内存泄漏工具检测。ps:不过很多工具都不够靠谱,或者收费昂贵。总结一下:内存泄漏非常常见,解决方案分为两种:1、事前预防型。如智

2024-02-03 00:24:03 2137

原创 C++:类和对象(下)

类和对象下

2024-02-02 12:11:27 246

Reactor反应堆服务器代码

单进程

2025-11-16

关于应用层Http协议的服务器后端代码

C++后端服务器代码

2025-09-21

空空如也

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

TA关注的人

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