自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从零到一:TCP 回声服务器与客户端的完整实现与原理详解

本文通过一个完整的 TCP 回声程序,展示了网络编程的核心流程:从socket创建、bind绑定、listen监听,到accept接收连接、readwrite收发数据,再到多进程并发处理。这些基础操作是理解 HTTP 服务器、RPC 框架等复杂网络应用的基石。通过亲手调试代码,你可以直观感受 TCP 的 "三次握手" 和 "四次挥手" 过程,理解可靠传输的底层逻辑。下一步,不妨尝试扩展功能,逐步深入网络编程的世界!

2025-08-13 22:17:21 440

原创 TCP Socket 编程实战:实现简易英译汉服务

TCP(传输控制协议)是一种面向连接、可靠的流式传输协议,与 UDP 的无连接特性不同,它通过三次握手建立连接、四次挥手断开连接,提供数据确认、重传机制,保证数据有序且完整传输。本文将基于 TCP Socket 编程,实现一个支持多客户端连接的英译汉服务,并详细解析 TCP 核心 API 及不同并发处理方案。本文通过实现一个英译汉服务,详细讲解了 TCP Socket 编程的核心流程与 API,并对比了单连接、多进程、多线程、线程池四种处理方案的优缺点。

2025-08-13 18:54:21 574

原创 使用 UDP 套接字实现客户端 - 服务器通信:完整指南

本文介绍了使用 UDP 套接字实现客户端 - 服务器通信的基本流程,并提供了完整的 C++代码实现。UDP 虽然不提供可靠性保证,但在对实时性要求高的场景中非常有用。

2025-08-13 13:06:05 229

原创 并发编程核心概念:从线程安全到死锁预防

原子性是并发操作的基本保证线程安全确保多线程环境下的数据一致性可重入函数是编写可靠并发代码的基础线程池能高效管理线程资源,提升性能死锁是并发编程的 "陷阱",需要通过合理设计来避免。

2025-08-12 14:30:29 557

原创 Socket 编程预备

端口号(port)是传输层协议的内容• 端口号是一个2字节16位的整数;• 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来 处理;• IP地址+端口号能够标识网络上的某一台主机的某一个进程;• 一个端口号只能被一个进程占用.0-1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的 端口号都是固定的.1024-65535:操作系统动态分配的端口号.客户端程序的端口号,就是由操作 系统从这个范围分配的.C++ socket n. (电源)插座;

2025-08-07 21:02:07 302

原创 网络基础概念

"协议"是一种约定。由计算机行业内的巨头来制定的,所有人都要遵循。

2025-08-07 19:48:24 386

原创 linux线程基础概念

本篇主要讲解线程相关知识和概念、线程的相关函数使用、二级页表的讲解。之前我们学过进程,而什么是线程呢??是LWP(轻量级进程),是内核级线程,由操作系统直接管理和调度。1、在一个程序里的一个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的控制序列”2、一切进程都至少有一个执行线程3、线程在进程内部运行,本质是在进程地址空间内运行4、在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。

2025-06-08 12:51:59 964

原创 linux信号详解

pending 位图:用于记录当前进程收到的所有信号,每一位对应一个信号,若该位为 1,表示进程收到了相应的信号。block 位图:用于记录当前被阻塞的信号,被阻塞的信号不会立即被处理,而是处于挂起状态,直到该信号的阻塞被解除。handler 位图:记录了每个信号对应的处理方式(默认、忽略、自定义处理函数)。信号处理是进程对收到的信号做出响应的过程。当进程收到一个信号时,系统会根据信号的处理方式进行相应的操作。如果是默认处理,系统会按照预定义的行为处理信号;如果是忽略信号,系统会直接丢弃该信号;

2025-06-02 21:23:10 1409

原创 linux 进程间通信_共享内存

共享内存(Shared Memory)是一种高效的‌‌,允许多个进程直接访问同一块物理内存区域,实现数据的快速交换。它是IPC中速度最快的方式,因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则需要将数据通过中间机制进行转换。共享内存的原理如上图所示,主要分为两部1.进程在物理内存上开辟一块空间,这块空间称为共享内存。2.不同进程将这块空间挂接到自己的进程地址空间中。3.进程通过虚拟地址和页表的映射找到共享内存,然后对共享内存进行读写数据。

2025-05-26 12:05:25 349

原创 Linux_ELF文件

是Unix/Linux系统下的标准可执行文件、目标文件和共享库格式。是一种文件格式的名称。

2025-05-17 19:50:39 1137

原创 Linux 动静态库详解

预处理:完成头文件展开、去注释、宏替换、条件编译等,最终形成xxx.i文件。编译: 完成词法分析、语法分析、语义分析、符号汇总等,检查无误后将代码翻译成汇编指令,最终形成xxx.s文件。汇编: 将汇编指令转换成二进制指令,最终形成xxx.o文件。链接: 将生成的各个xxx.o文件进行链接,最终形成可执行程序。‌静态库‌:在编译时,库的代码被直接复制到可执行文件中,程序运行时不依赖外部库文件。‌动态库‌:在程序运行时加载库的代码,多个程序共享同一份库的实现,节省内存和磁盘空间。

2025-05-14 11:08:22 1081

原创 Linux文件系统

‌‌‌‌‌‌。

2025-05-12 21:40:20 1092

原创 Linux 软硬连接详解

定义:软链接是一个独立的文件,拥有自己的 inode 和属性,其内容存储目标文件/目录的路径字符串,类似于 Windows 的快捷方式。特性。

2025-05-12 18:45:12 741

原创 Linux 详解inode

‌ 是Linux文件系统中的一种数据结构,用于存储文件或目录的元数据(metadata)。每个文件或目录在文件系统中都有一个唯一的inode编号,它记录了文件的关键信息,但不包含文件名或文件内容本身。

2025-05-12 18:11:02 552

原创 Linux_进程退出与进程等待

tatus不能简单的当作整型来看,要从二进制的角度来看,32位下,整型转化为二进制有32个bit位,但是我们仅关注低16位。是用于接收子进程终止状态的关键参数,需配合特定宏解析具体信息。父进程在忙,子进程结束了,但无人回收,这样就造成了“死亡”的子进程一直占用资源。为了解决这个问题,最初的思路是:让父进程停下,等待子进程执行完,然后回。_exit :立即终止进程,不执行任何清理操作。若父进程不关心子进程状态,可将参数设为。,此时仅等待子进程结束而不获取状态信息。这个时候的子进程被称为“僵尸进程”

2025-05-08 22:24:15 1278

原创 Linux 进程替换

原理:进程替换是指通过调用特定的系统调用(如exec系列函数),将一个进程当前执行的程序完全替换为新的程序映像。替换后,原进程的代码段、数据段、堆栈等内存空间被新程序覆盖,但进程的 PID、文件描述符等资源保持不变13。替换成功后,原进程的后续代码不再执行,仅保留新程序的执行入口。

2025-05-08 19:11:53 240

原创 linux_进程地址空间(虚拟地址空间)

先看这样一个具体的例子我们发现在同一个地址空间的a变量,父进程和子进程访问时获取的值却不是相同的,这是什么原因呢?首先,我们可以理解,父子进程的值不同是因为进程间具有独立性,但是这里的i的地址居然是相同的。因此,我们可以先排除该地址是变量i在物理磁盘上的地址的可能性(因为物理磁盘的同一个地址,只能存放唯一确定的一个值)。因此,这个地址只能是虚拟地址(也称为线性地址在Linux中,有时候我们也将这种地址称为逻辑地址。操作系统为每个进程都创建了,这样每个进程都能独立的运行。

2025-05-07 21:02:58 850

原创 unordered_map、unordered_set详解

‌何时选择?‌通过合理选择容器,可以显著提升程序性能。对于大多数高频操作场景,和凭借其哈希表的高效性,成为C++开发者的首选工具。‌‌负载因子(Load Factor)‌:桶中元素平均数量,影响冲突概率。// 设置最大负载因子// 预分配桶数量。

2025-04-20 22:34:01 677

原创 快排超详解

1. 时间复杂度:O(N*logN)2. 空间复杂度:O(logN)3. 稳定性:不稳定。

2025-04-20 14:40:44 724

原创 红黑树总结

通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍(最长路径也不会超出最短路径的两倍,因此红黑树的平衡性要求相对宽松,没有AVL树那样严格),从而使搜索树达到一种相对平衡的状态。红黑树(Red-Black Tree)也是是一种自平衡的二叉搜索树,与AVL树不同的是它在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。任意结点到其每个叶子结点的简单路径上,黑色节点的数量相同:确保了树的黑平衡性,即红黑树中每条路径上黑色结点的数量一致。

2025-04-20 12:34:12 307

原创 智能指针(内存泄漏)

不是所有智能指针都用这个思想可以有效避免死锁问题。

2025-04-15 22:53:14 690

原创 C++11新增特性—>可变参数模板、lambda表达式、包装器

1、【概念】可变参数模板是C++11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板,这里主要针对函数模板的可变参数。在C++11之前,类模板和函数模板中只能包含固定数量的模板参数,可变模板参数无疑是一个巨大的改进,但由于可变参数模板比较抽象,因此使用起来需要一定的技巧。在C++11之前其实也有可变参数的概念,比如printf函数就能够接收任意多个参数,但这是函数参数的可变参数,并不是模板的可变参数。

2025-04-05 14:37:04 587

原创 左值引用与右值引用详解

左值是一个表示数据的,比如:变量名、解引用的指针变量。一般地,我们可以获取它的地址和对它赋值,定义时const修饰符后的左 值,不能给他赋值,但是可以取它的地址。总体而言,可以取地址的对象就是左值。

2025-02-27 20:55:17 1158

原创 AVL树详解

AVL树,又称为平衡二叉树,它基于二叉搜索树并通过平衡而得到。在数据结构中,二叉搜索树可以提高搜索数据的效率,但在数据有序的情况下会退化为单支树,此时在树中查找元素就得遍历一整个分支,时间复杂度也会退化至O(N)。AVL树的左右子树高度差不能超过1,也就是说每个节点的平衡因子的绝对值不能超过1;, _bf(0){}//节点的父节点T _data;//节点的值int _bf;// 节点的平衡因子。

2025-02-19 13:42:41 869

原创 c++ map和set功能详解

1. set是按照一定次序存储元素的容器。2. 在 set 中,元素的 value 也标识它 (value 就是 key ,类型为 T) ,并且每个 value 必须是唯一的。set中的元素不能在容器中修改( 元素总是 const) ,但是可以从容器中插入或删除它们。3.在内部, set 中的元素总是按照其内部比较对象 ( 类型比较 ) 所指示的特定严格弱排序准则进行 排序。

2025-02-17 14:02:41 859

原创 二叉搜索树

/分装每一个节点,定义成模板函数K _key;{}//搜素树的定义public:private:在BSTree类种主要实现四个函数:插入,删除,查找,中序遍历。(中序遍历搜索二叉树时得到的是有序的)下面为二叉树的代码实现,只有看了代码实现,才会对二叉树有了更深刻的认识创建一个二叉搜索树的过程,也就是不断的插入。插入的具体过程如下:1、树为空,则直接新增节点,赋值给root指针2、树不空,按二叉搜索树性质查找插入位置,插入新节点//如果树为空的情况。

2025-02-13 12:42:09 865

原创 C++多态详解

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。基类的虚函数进行重写在继承中要构成多态还有两个条件(二者缺一不可):1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:virtual void BuyTicket() { cout << "买票-全价" << endl;

2025-02-11 18:38:58 748

原创 C++继承

1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。

2025-02-09 19:52:30 655

原创 vector迭代器失效问题

迭代器,一种类似指针一样的东西,定义格式是。

2025-02-05 20:43:53 437

原创 vector的使用

vector,也叫“变长数组”,即长度根据需要改变的数组。在算法竞赛中有十分广泛的使用

2025-02-04 23:23:24 413

原创 string类

在string拷贝的时候,第三个参数len如果不传或者传大于拷贝字符串的长度,就是将第二个参数pos开始拷贝到字符串结束。对于string类型,可以用迭代器来访问,也可以用[ ]来访问。对于有const修饰的字符串不可被修改,没有则可以修改。拷贝构造,流插入和流提取。可以用对象加.操作符来访问。

2024-11-14 17:26:13 139

原创 C++模板

1. 函数模板函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本。函数模板格式注意:template 返回值类型 函数名(参数列表){}typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替 class)函数模板的实例化:用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化 和显式实例化1. 隐式实例化:让编译器根据实参推演模板参数的实际类型。

2024-11-05 22:24:38 239

原创 C++内存管理

1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。3. 堆用于程序运行时动态内存分配,堆是可以上增长的。4. 数据段--存储全局数据和静态数据。5. 代码段--可执行的代码/只读常量。

2024-11-03 23:31:25 421

原创 C++类和对象

赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟 拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。赋值运算符重载的特点:1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成 const 当前类类型引⽤,否则会传值传参会有拷⻉2. 有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋 值场景。

2024-11-03 22:51:47 313

原创 C++类和对象

默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数。

2024-10-27 22:36:07 243

原创 C++的类和对象相关知识详解

1、class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。2、定义在类⾯的成员函数默认为inline。C++ 升级 struct 升级成了类1 、类⾥⾯可以定义函数2 、 struct 名称就可以代表类型不再需要 typedef , ListNodeCPP 就可以代表类型。

2024-10-27 21:28:29 1228

原创 内敛函数 和 nullptr

⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

2024-10-27 20:57:03 196

原创 进程的创建和终止

在程序创建子进程的时候,子进程和父进程的代码和数据是一起的,权限会更新成只读的;当子进程写入的时候会触发系统的错误发生缺页中断(权限的不匹配),此时系统会发生判定是否需要写时拷贝,如果需要,系统会将父进程的数据区进行拷贝一份,让子进程对拷贝的数据进行修改。申请内存,发生拷贝,修改页表,权限的更新。为什么要有写时拷贝????为了节省内存空间子进程和父进程的大部分数据都相同,不一定要全覆盖,写时拷贝有效节约了内存空间;

2024-10-27 20:40:07 487

原创 C++命名空间作用域

域:名字的隔离;影响查找规则1、作用域 限定符(指定)2、命名空间作用域可以嵌套3、多个文件可以定义同名的命名空间,在调用的时候会合并查找顺序规则:a、当前局部域b、全局域(不会到其他的命名空间作用域找)c、展开的命名空间作用域using namespace std->官方库展开命名空间作用域=>也有好处也有坏处,不能随便展开存在默认查找顺序,不太怕冲突4、指定展开某一个using bitx影响生命周期=>局部域=>全局域不影响 ->命名空间作用域。

2024-10-26 17:57:37 410

原创 Linux常见指令大全

dst目录: 把指定的目录(默认是当前目录)下,新建并拷贝src,拷贝的文件或目录的名称就叫做dst。date +%Y-%m-%d/%H:%M:%s -d@时间戳=>显示时间戳所在时间。dst文件:在指定的目录(默认是当前目录)下,新建并拷贝src。本应该从键盘输入的数据变为从指定文件读取数据。5、touch创建普通文件(如:touch ./test.c)mv src(文件,目录) dst(文件,目录)-l命令选项(显示更详细的文件内容)快捷=>ll。13、op src(文件,目录) dst(文件,目录)

2024-10-25 15:44:19 355

空空如也

空空如也

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

TA关注的人

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