自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++新手项目-JsonRPC框架

1. 什么是RPCRPC(Remote Procedure Call)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,⽽不需要了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信, 如HTTP、TCP、UDP等, 并且在TCP/IP⽹络四层模型中跨越了传输层和应⽤层。简⾔之RPC就是像调⽤本地⽅法⼀样调⽤远程⽅法。过程可以理解为业务处理、计算任务,更直⽩的说,就是程序/⽅法/函数等,就是像调⽤本地⽅法⼀样调⽤远程⽅法。人话:远程调用 Netcal让调用者感知不到调用了远程方法。

2025-10-27 14:48:12 688

原创 【LINUX网络】实现Epoll服务器+基于代码理解Reactor

假设有以下情景:我们已经把一个tcp socket添加到 epoll 描述符,用户层调用了 epoll_wait。这个时候 socket 的另一端被写入了2KB 的数据 ,epoll会返回该tcp_socket及其对应的事件.,说明它现在已经读事件就绪,但是我们的buffer数组只有1024的大小(也就是1kb), 也就是说,本次recv(或者read等等)只读了1kb,还有1kb留存在缓冲区中:1. LT模式。

2025-10-12 13:44:18 636

原创 【LINUX网络】Poll与Epoll

了解Poll,深度从原理和代码层面了解epoll机制——从文件描述符打通到tcp/udp再到epoll

2025-10-05 12:57:39 1033

原创 【LINUX网络】多路转接select

本文介绍了Linux网络编程中的IO模型与多路转接技术,重点讲解了select系统调用的实现原理和使用方法。文章详细分析了select函数的参数设置、fd_set位图管理机制,并通过代码示例展示了如何构建基于select的TCP服务器。作者指出select存在文件描述符数量限制(通常1024个)、编码复杂度高及循环检测效率低等问题,并提到后续的poll/epoll技术将解决这些缺陷。文中还提供了完整的SelectServer实现代码,演示了如何处理连接建立、数据读写和连接关闭等事件,同时强调了select在

2025-10-02 14:57:45 860

原创 【LINUX网络】IO模型与(非)阻塞IO

本文介绍了五种基础IO模型,重点对比了同步IO与异步IO的区别。IO本质是等待+拷贝的过程,高效IO的关键在于减少等待时间。五种模型包括:1)阻塞IO-进程挂起等待数据就绪;2)非阻塞IO-轮询检查状态,消耗CPU;3)信号驱动IO-内核通过信号通知就绪;4)多路复用IO-同时监控多个描述符;5)异步IO-内核完成全部IO操作后通知。其中前四种都属于同步IO,只有异步IO是真正的异步操作。文章还演示了使用fcntl系统调用设置文件描述符为非阻塞模式的具体实现方法,通过F_GETFL/F_SETFL操作O_N

2025-09-30 12:58:33 675

原创 C++新手项目——高并发内存池随记

a本篇指在记录博主学习、完成该项目时的笔记和感想,不适用于面面俱到的学习。1.项目介绍本项目旨在实现一个高并发内存池,其原型参考了Google的开源项目tcmalloc。tcmalloc全称为Thread-Caching Malloc,通过线程缓存机制实现了高效的多线程内存管理,可替代系统的malloc、free等内存分配函数。本项目通过简化tcmalloc的核心框架,模拟实现了一个自主开发的高并发内存池。其主要目的是深入理解并掌握tcmalloc的设计精髓。何为内存池。

2025-09-26 00:39:20 980

原创 【LINUX网络】NAT _ 代理_ 内网穿透

客户端将请求发送给正向代理服务器,正向代理服务器接收请求后,根据配置进行处理,例如缓存查找或内容过滤等。接着,正向代理服务器将处理后的请求转发给目标服务器,目标服务器处理请求后,将响应返回给正向代理服务器,最后正向代理服务器将响应返回给客户端。有大致如下作用:1. 正向代理服务器可以缓存client经常访问的资源,当client再次访问这个资源时可以直接返回。2.隐藏客户隐私,隐藏客户的IP,提高客户的安全性3.过滤、控制客户端的请求,控制经过代理服务器的响应和请求。比如。

2025-09-19 11:22:15 740

原创 【LINUX网络】数据链路层

"以太网"并非指代具体网络,而是作为一种技术标准存在。它同时涵盖数据链路层和部分物理层规范,包括网络拓扑结构、访问控制机制和传输速率等具体技术要求。以太网要求使用双绞线作为传输介质支持10Mbps、100Mbps、1000Mbps等多种传输速率作为当前应用最广泛的局域网技术,以太网已成为行业基础标准。

2025-09-12 18:04:23 905

原创 【LINUX网络】IP——网络层

根据已经学习的TCP\UDP等内容,对IP网络层进行学习记录

2025-09-09 10:38:18 1223

原创 【LINUX网络】TCP原理

本文深入探讨TCP协议的核心机制和工作原理。首先介绍了TCP作为一种面向连接的可靠传输协议,其标准报头结构(20字节可扩展)和各字段功能。重点解析了TCP的三大核心机制:确认应答机制通过序号和确认序号保证历史消息可靠性;流量控制利用16位窗口大小动态调整发送速率;超时重传采用指数退避算法应对丢包问题。文章详细阐述了TCP连接管理的三次握手和四次挥手过程,分析了TIME_WAIT状态的作用及其2MSL时长的设计考量。此外,还探讨了滑动窗口、拥塞控制、延迟应答等优化传输效率的机制,以及粘包问题和连接异常处理等实

2025-08-28 16:47:31 725

原创 【LINUX网络】UDP协议基础原理

在已经简单实现了UDP\TCP\HTTP的简单服务之后,我们重谈一些理论内容,理解UDP和TCP的底层。UDP比TCP简单很多,我们逐步学习。

2025-08-21 15:46:43 648

原创 【LINUX网络】HTTP服务器搭建完善+报头属性&状态码

本文介绍了HTTP协议的基本结构和实现简单HTTP服务器的关键概念。主要内容包括:1. HTTP代理服务器的功能与负载均衡原理;2. HTTP请求/响应报头的分类和常见属性(如Host、User-Agent等);3. HTTP状态码的分类和应用场景(重点解析301/302重定向);4. GET与POST方法的区别及动态资源处理;5. 实现动态资源请求处理的代码设计思路,包括路由注册机制和响应构建方法。文章通过具体示例演示了如何搭建支持动态请求的HTTP服务器,并分析了常见网络问题如favicon.ico请求

2025-08-20 11:43:51 875

原创 【LINUX网络】HTTP协议基本结构、搭建自己的HTTP简单服务器

从http原理到使用C++从0手搓一个http服务框架

2025-08-15 13:54:52 875

原创 [LINUX操作系统]守护进程基础

比如在Linux中测试:2.会话通常我们都是使用管道将几个进程编成一个进程组。 如上图的进程组 2 和进程组 3 可 能是由下列命令形成的:3. 后台与前台那这个时候那bash进程在哪里呢?SID假设在我们的远端服务器上,bash造了一个进程组那么,如何把一个进程抽出来抽成守护进程呢?有一种直接daemon函数,不过很多程序员也更喜欢去手动setsid。如果ps一个守护进程,可以发现:守护进程的ppid就是1,直接由操作系统管理。tips:/dev/null

2025-08-08 08:47:47 959

原创 【LINUX网络】应用层自定义协议与序列化——通过实现一个简单的网络计算器来体会自定义协议

本文主要探讨了网络通信中的序列化与反序列化问题,以及全双工通信的实现原理。首先解释了在网络传输中直接传递二进制结构体存在的兼容性问题,提出通过序列化将结构化数据转换为无歧义的字节流。接着分析了TCP/UDP全双工通信的本质,指出其基于内核的双缓冲区机制。文章重点介绍了JSONCPP库的使用方法,包括三种序列化方式(toStyledString、StreamWriter、FastWriter)和反序列化方法。最后通过实现网络计算器案例,展示了如何设计应用层协议、添加报头处理TCP粘包问题,并构建三层架构(计算

2025-08-07 12:58:30 1133

原创 【LINUX网络】使用TCP简易通信

本文介绍了TCP网络编程的基础知识,重点讲解了服务端和客户端的实现方法。服务端需要创建监听套接字(listen)、接受连接(accept)和处理请求三个步骤,客户端则通过connect连接服务端。文章详细说明了TCP面向字节流的特性,包括无消息边界、数据完整性和粘包问题,并对比了UDP面向报文的特点。针对TCP通信中的常见问题如文件描述符泄露、SIGPIPE信号等,提供了解决方案,包括多进程、多线程和线程池三种实现方式。最后,通过popen接口实现了客户端远程控制服务器执行命令的功能,采用白名单机制确保安全

2025-07-30 15:07:27 795

原创 【LINUX网络】UDP协议实现多人聊天室

本文依赖前两文所学习的内容以及实现的代码在先前基本的使用过程中,我们已经成功实现了。既然单个用户(另外一台机器)能够与服务器建立通信,那么不难推断,多个用户同时连接至一台服务器,同样可以与服务器进行信息交流。本篇就是利用UDP的操作实现上面提到的简易聊天室,其中客户端向服务端发送消息,服务端将收到的消息转发给所有连接到当前的客户端注意:本次实现基于前面封装的服务端和客户端为了实现多用户连接同一台服务器(是否可以用一个User类来描述呢?

2025-07-08 14:09:13 752

原创 【LINUX网络】实现简易UDP通信(2)——简单的字典

完成一个简单的网络小小小字典

2025-06-29 14:55:05 802

原创 【Linux网络加餐】几条网络相关指令

本文介绍了五个实用的Linux网络命令:1. ping用于测试主机间网络连通性;2. netstat显示网络连接、路由表等信息,支持多种参数查看TCP/UDP连接;3. watch定时执行命令并动态显示输出变化;4. pidof快速查找进程ID;5. xargs将管道输出转为命令参数,常与pidof配合使用。这些命令涵盖了网络测试、状态监控和进程管理等常见运维需求。

2025-06-21 20:34:55 808

原创 【LINUX网络】网络socet接口的基本使用以及实现简易UDP通信

手把手带着0基础网络编程小白写一个UDP协议demo,实现本地和网络通信,进入网络编程世界,快速学习网络编程。

2025-06-19 18:30:36 842

原创 Socket编程预备

适合在第一次socket编程之前浏览学习

2025-06-16 20:20:27 874

原创 网络基础知识

本文主要介绍了计算机网络协议的基本概念、分层模型及传输流程。首先阐述了协议的作用与必要性,指出协议是通信双方共同遵守的结构化标准。接着详细讲解了OSI七层模型和TCP/IP四层模型的分层架构,包括物理层、数据链路层、网络层、传输层和应用层的功能划分。重点分析了局域网和跨网络的数据传输流程,解释了IP地址与MAC地址的差异及其在网络路由中的作用。通过分层封装和解包的过程,说明了网络通信如何实现不同系统间的协同工作。最后指出IP层的核心价值在于构建网络虚拟层,屏蔽底层物理网络的差异。全文以通俗易懂的方式揭示了网

2025-06-15 17:22:46 1092

原创 【LINUX操作系统】线程池——线程部分综合运用并实现一个自己的线程池

利用学习过的线程知识和自己封装的线程库,一步一步记录如何写一个属于自己的线程库。并且对线程的性质进行实践后的分析,希望学习C++系统部分的同学跟着本文、本系列一起学习

2025-05-23 18:23:05 988

原创 【LINUX操作系统】日志系统——自己实现一个简易的日志系统

本文介绍了如何利用多线程技术构建一个简易的日志系统。日志系统是记录系统和软件运行事件的重要工具,用于监控状态、记录异常并帮助问题定位。文章首先解释了日志的基本概念和内容,包括时间戳、日志等级和日志内容等,并提到了一些现成的日志解决方案。接着,文章详细描述了如何构建一个自定义的日志系统,包括日志字符串的构建和刷新策略的设计。日志系统支持控制台和文件两种刷新方式,并使用了策略模式来实现灵活的日志输出。最后,文章介绍了如何使用日志系统,并通过宏定义简化了日志的调用过程。通过本文,读者可以掌握日志系统的基本原理和实

2025-05-20 20:09:25 881

原创 【LINUX操作系统】生产者消费者模型(下):封装、信号量与环形队列

本文主要介绍了基于阻塞队列和环形队列的生产者-消费者模型的实现与优化。首先,通过封装条件变量和互斥锁,将面向过程的代码转换为面向对象的风格,简化了线程同步与互斥的操作。接着,详细阐述了阻塞队列的实现,包括生产者与消费者的同步机制,并通过任务传递模型展示了其应用场景。随后,引入了POSIX信号量,解释了其工作原理及其在同步中的作用。最后,介绍了基于环形队列的生产者-消费者模型,利用信号量实现并发处理,并通过多生产者多消费者的场景进一步优化了模型。文章强调了信号量和锁的使用,确保了线程间的同步与互斥,同时提升了

2025-05-17 17:22:04 1277

原创 【LINUX操作系统】生产者消费者模型(上):概念与阻塞队列

本文详细介绍了生产者-消费者模型及其在多线程编程中的应用。生产者-消费者模型通过一个共享的缓冲区(如超市)来解耦生产者和消费者,提升效率并支持忙闲不均。文章还讨论了线程间的互斥与同步问题,强调了使用条件变量和互斥锁的重要性。通过C++代码示例,展示了如何实现一个阻塞队列,并解释了在队列满或空时如何通过条件变量进行线程阻塞和唤醒。此外,文章还探讨了伪唤醒问题及其解决方案,建议使用while循环而非if语句来重新检查条件,确保线程在正确状态下继续执行。最后,文章总结了在多生产者和多消费者场景下,如何通过合理的锁

2025-05-15 11:40:08 823

原创 【LINUX操作系统】线程同步与互斥

本文主要探讨了多线程编程中的互斥与同步机制,重点介绍了如何通过互斥锁(Mutex)和条件变量(Condition Variable)来保护共享资源,提升代码的安全性和效率。首先,文章通过“抢票”代码示例展示了多线程环境下共享资源的竞争问题,并详细解释了如何通过互斥锁来避免资源冲突。接着,文章深入探讨了互斥锁的实现原理,包括加锁、解锁的原子性操作,以及锁的保护机制。随后,文章介绍了条件变量的使用,解释了如何通过条件变量实现线程的同步,避免线程饥饿问题。最后,文章通过代码示例展示了如何在“抢票”模型中使用条件变

2025-05-14 14:36:54 989

原创 【LINUX操作系统】线程库与线程库封装

封装一个Thread库,进一步理解线程库与线程各个接口之间的关系。

2025-05-07 20:23:09 929

原创 【LINUX操作系统】线程操作

除了C语言对系统的相关线程操作进行了封装外,其他编程语言也会做同样的事情,这样可以确保语言具有可移植性,同样,C++中也有对应的线程库<thread>,具体接口见C++线程库部分,但是需要注意的是,如果是在Linux下使用C++线程库编写代码,编译该代码时依旧需要携带-lpthread,因为C++线程库本质也是封装了libpthread.so。),最后一个是线程要执行的函数的参数。,所以存在打印错乱的情况,但是的确可以做到每一个线程完成自己的任务而不会受到其他线程的干扰,这两个线程就是两个不同的执行流,

2025-04-28 16:29:07 1316

原创 【LINUX操作系统】线程基础与分页式存储管理

看似讲线程基础,实则结合了计组/操作系统等知识学习整个分页的框架。

2025-04-20 13:26:24 704

原创 【LINUX操作系统】信号保存/捕捉与操作系统运行原理

本节主要涉及:信号保存(涉及操作),信号捕捉,中断(计组原理)博主自己在没有系统学计组的情况理解了软中断的意义,全是干货,建议学习

2025-04-13 13:55:05 855

原创 【LINUX操作系统】初识信号及信号的产生与捕捉

你在⽹上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临 时,你该怎么处理快递。也就是你能“识别快递”当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的⾏为 并不是⼀定要⽴即执⾏,可以理解成“在合适的时候去取”。在收到通知,再到你拿到快递期间,是有⼀个时间窗⼝的,在这段时间,你并没有拿到快递,但是你知道有⼀个快递已经来了。

2025-04-09 11:42:08 960

原创 【LINUX操作系统】通过System V看内核管理IPC资源

shmgetmsggetsemgetshmatshmdtmsgsndmsgrcvsemopshmctlIPC_RMIDmsgctlIPC_RMIDsemctlIPC_RMID我们一直强调“先描述、再组织”,现在来看一下这三种通信方式的组织结构是不是差不多。可以直接在机器上通过man xxxctl 查看!man shmctl共享内存对应属性的数据模块消息队列:信号量:例如其中的__key表示资源在系统中的编号,另外还有对应的uid表示持有当前资源的用户,三者除了有结构外,还有一些其他成员也基本类似。

2025-04-02 21:16:56 955

原创 【LINUX操作系统】浅显认识消息队列与信号量

完成了System V中对共享内存的学习之后,我们浅显认识一下消息队列与信号量。

2025-04-02 16:58:49 771

原创 【LINUX操作系统】进程间通信下:命名管道与system V

学习本章之前建议先学习匿名管道的基本使用。

2025-03-31 13:56:31 697

原创 【LINUX操作系统】进程间通信上(认识管道到手搓进程池)

入门管道的不错选择

2025-03-28 00:22:01 865

原创 【LINUX操作系统】 动静态库的链接原理

甚至,整个系统可以什么都不加载,只加载一个可加载程序ELF Header的entry部分。

2025-03-20 17:32:05 712

原创 初识linux(16) 动静态库(手搓动静态库!)

手搓动静态库,并学习如何使用自己的库,如何加载第三方库,以及加载时会遇到的问题。文章内容较长,全是干货。

2025-03-17 17:56:16 837

原创 初识linux(15)软硬链接

由上文知道,系统都是通过inode去查找文件的。在Linux中,可以让两个文件名去映射同一个inode。

2025-03-17 01:44:07 662

原创 初识Linux(14)Ext系列⽂件系统

之前谈论的都是已打开文件在操作系统的中的管理,但是还有更多的文件没有被打开,被存在磁盘中,如何管理这些磁盘中的文件,就是本篇的学习目标。

2025-03-14 17:52:23 854 1

空空如也

空空如也

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

TA关注的人

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