- 博客(96)
- 收藏
- 关注
原创 五种IO模型与阻塞IO
在网络中通信的本质其实是网络中的两台主机的进程间进行通信,而进程通信的本质就是IO。IO分为输入(input)和输出(output)站在进程的角度讲,进程出去数据为输出,外部数据进入进程为输入站在内存的角度讲,OS的数据流入硬件为输入,硬件的数据流入OS为输出通常我们进行IO要使用的recv、send、read、write等函数,他们的工作其实分为两步等+拷贝数据。
2024-10-06 10:45:09 789
原创 [网络]抓包工具介绍 tcpdump
如果没有安装,可以使用包管理器 进行安装。注意:-i any 指定捕获所有网络接口上的数据包,tcp 指定捕获 TCP 协议的数据包。例如,要捕获端口号为 80 的 TCP 报文(通常是HTTP 请求),可以使用以下命令。pcap 后缀的文件通常与 PCAP(Packet Capture)文件格式相关,这是一 种用于捕获网络数据包的文件格式。这将把捕获到的 HTTP 流量保存到名为 data.pcap 的文件中。使用 -w 选项可以将捕获的数据包保存到文件中,以便后续分析。
2024-09-30 16:39:42 2278 1
原创 【网络】手动部署内网穿透(超详细教程)
注意8888端口号是用于frp服务端与客户端进行连接的,而8080端口号是在frp的连接建立好后推送给服务器的,目的是让其在新建一个套接字,使服务器的8080端口号与虚拟机中的22号端口号构建映射,这样当别的主机访问服务器的8080端口号,服务器就会把请求直接推送给虚拟机的22号端口号(因为要验证ssh,所以设置为了22)首先我们在服务器中打开解压好的文件,打开frps.toml配置文件,里面有一个端口号默认为7000,我们可以自行修改,这个端口号是给frpc客户端看的,用于建立frp之间的连接。
2024-09-29 20:55:53 372
原创 [网络]数据链路层-MAC帧与ARP协议
当两台主机在进行跨网络通信时,发送方可以根据目的IP找到目的主机所在的子网路由器,但是仅仅知道目的主机的IP地址与端口号,不知道目的主机的硬件地址(MAC地址),由于数据帧的传输是在数据链路层进行的,因此必须知道目标设备的MAC地址才能正确发送数据。当主机收到MAC帧后,会根据MAC帧当中的目的地址来判断该MAC帧是否是发给自己的,如果是发送给自己的会对其进行CRC校验,如果校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理,如果不是发送给自己的则在数据链路层直接将数据丢弃。
2024-09-27 07:30:00 1982
原创 【网络】传输层协议TCP
为什么是四次挥手,不能向三次握手一样采用捎带应答,称为三次挥手吗?四次挥手主要是因为TCP是全双工通信协议,即数据可以在两个方向上同时传输。在断开连接时,需要确保两个方向上的数据传输都已经被正确处理和确认,以避免数据丢失或连接状态不一致的问题。当客户端数据发送完成申请断开连接时,服务器会无条件同意,但是不能采用捎带应答的方式向客户端发送FIN请求,因为此时服务端可能还有数据要发送给客户端,只有当服务器的数据全部发送完成时才会向客户端发送FIN请求断开连接。
2024-09-18 15:47:10 1155 4
原创 【网络】传输层协议UDP
UDP存在缓冲区的意义是他可以保存一些报文,除了上层正在处理的报文外,OS可能还会不断地从硬件读取报文,所以有的报文可能正在被处理,有的报文可能需要放到缓冲区中,并且有的报文需要向上交付,有的需要向下交付,总之OS内部可能同时存在许多的报文,那OS就需要管理这些报文,那如何管理呢?UDP的报头是固定长度的,分为四部分,每部分16位一共8个字节,数据报前8个字节就是报头,而数据报的总长度我们是知道的,剩下的就是有效载荷的长度。"源 IP", "源端口号", "目的 IP", "目的端口号", "协议号"
2024-09-13 16:33:17 1367
原创 [网络]HTTP协议 Cookie与Session
HTTP Cookie(也称为 Web Cookie、浏览器 Cookie 或简称 Cookie)是服务器发送到 用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发 起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。由于 HTTP 协议是无状态的(每个请求都是独立的),因此服务器需要通过 Session 来记住用户的信息。
2024-09-07 08:08:11 1032
原创 HTTPS协议原理
HTTP协议是用于超文本传输的应用层协议,但是HTTP协议在数据传输时,内容都是文本式的明文传输,这就导致传输一些用户个人信息时可能会造成信息泄露。HTTPS协议就是在HTTP协议的基础上添加了一个加密层(TLS(传输层安全)和SSL(安全套接字层)),这个加密层也属于应用层,在进行数据传输时需要先将数据进过加密层进行加密,在发送给对方,对方接收到数据再进过加密层进行解密,就得到了对应的信息。数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash 函数)对信息进行运算, 生成一串固定长度的数字摘要。
2024-09-05 16:29:00 607
原创 应用层协议Http
在进行网络通信时,应用层协议一般都是程序员自己写的,但是有一些大佬其实已经定义出了一些现成的应用层协议,例如:HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、POP3(邮局协议版本3)、IMAP(Internet邮件访问协议)、DNS(域名系统)、SNMP(简单网络管理协议)、DHCP(动态主机配置协议)等等HTTP 协议是客户端与服务器之间通信的基础。它规定了客户端(通常是浏览器)和服务器之间交换数据(尤其是超文本)的格式和方式。
2024-09-04 10:33:02 1069
原创 Linux-进程间关系与守护进程
守护进程(Daemon Process)是在Unix和类Unix操作系统(如Linux)中运行的一种特殊类型的进程。它们通常在系统启动时自动启动,并在后台运行,执行一些诸如监控或管理其他进程、系统服务、网络服务等任务。
2024-08-20 13:32:58 1083 1
原创 网络版计算器(理解协议与序列化与反序列化)
Jsoncpp 是一个用于处理 JSON 数据的 C++ 库。它提供了将 JSON 数据序列化为字 符串以及从字符串反序列化为 C++ 数据结构的功能。Jsoncpp 是开源的,广泛用于各 种需要处理 JSON 数据的 C++ 项目中。
2024-08-18 17:59:49 753
原创 C++类型转换问题
我们执行上述代码,会发现结果为 3 1,这是因为 i 定义的是常量属性,编译器认为他不会被修改,为了后续方便获取 i 的值可能将 i 的值直接放到寄存器里了,而指针p获取的是内存里的值,直接获取i是获取的寄存器里的值,所以才会出现不同,这时我们就需要再i的前面加上volatile关键字,让编译器不要对i进行优化,获取值直接到内存中找。一般情况我们认为父类对象的指针/引用是不能转换为子类的,因为父类对象中可能不存在子类的一些成员,会造成访问错误,但是父类对象的指针/引用其实存在两种情况、
2024-08-11 21:57:00 536
原创 C++特殊类设计
懒汉模式完美解决了饿汉模式存在的两个问题,但是上述写法还存在一点问题,在多线程下是不安全的,比如一个线程已经判断_sgl为空,准备return了,此时轮转到另一个线程了,它依旧可以进入if语句中,创建好一个对象并返回,假如后续又轮转到第一个线程了,他又会创建一个对象,那么此时一共创建了两个不同的对象,并且上一个对象的资源造成了内存泄漏,是很严重的问题,我们可以加锁来解决。但是上述代码还存在一定的问题,由于我们没有管控拷贝构造函数,如果我们先在堆上创建了一个对象,我们依旧可以调用拷贝构造在栈上创建对象。
2024-08-11 15:58:13 796
原创 TCP网络套接字
这里还有一个小细节,子进程会继承父进程的文件描述符表,我们知道每一个客户端会对应一个sockfd,而文件描述符表本质就是一个数组,也是有数量大小的,当客户端的数量比较多了的话文件描述符表可能就会被占满,其次父进程不关心业务执行什么,也就是父进程不关心sockfd,所以每当创建一个子进程建议父进程将sockfd关掉,也建议子进程将listenfd也关掉方式误操作,这样不论有多少个客户端,其对应的文件描述符永远是4。这样,当套接字进行通信时,就可以使用这个指定的地址作为通信的源地址。
2024-08-09 18:17:14 1420 4
原创 UDP网络套接字
其实并不是,在现实生活中,我们通过网络聊天是人与人在聊天,下载软件是人在下载,浏览网页是人在浏览,而我们聊天用的微信、下载用的应用商店、浏览用的浏览器在主机中是不同的进程,所以人在主机中的体现就是一个进程,网络通信的本质就是一个主机的进程将信息发送到另一个主机的进程,即。ps:可靠与不可靠不是两个协议的优缺点而是特点,UDP协议是不可靠的注定它的实现和使用是相对容易的,TCP协议虽然是可靠的但是也注定其实现和使用是相对麻烦的,故两个协议没有好坏之分,在不同的场景下两个协议各有各的优点。
2024-08-09 15:58:04 1370
原创 网络基础知识
以太网中,任何时刻,只允许一台机器向网络中发送数据,如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞,没有交换机的情况下,一个以太网就是一个碰撞域,所有发送数据的主机要进行碰撞检测和碰撞避免,如果数据链路层的标准是以太网的话,当一个设备发送数据发生数据碰撞后,该设备就停止发送,让其他设备先发送,所以以太网的处理方式可以认为是一种乐观的处理机制,因为同一时间有两个设备同时发送数据的概率并不高。协议的本质也是一个软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的。除了报头,剩下的叫做。
2024-08-08 18:32:45 1040
原创 C++ 智能指针
它是通过引用计数的方式来解决释放两次资源的问题的,当发生拷贝时,会让这个资源的引用计数加1,当一个智能指针调用析构函数时,首先会让引用计数减1,如果此时引用计数为0的话表示没有智能指针指向这个资源了,就会释放掉这个资源,如果引用计数不为0的话,表示还有智能指针指向这个资源,此时就不会释放掉资源了。如果p2申请空间抛异常的话,p1一定是已经开辟好的,最后的delete p1语句就执行不了了,也会造成内存泄漏,虽然我们也可以通过抛异常的方式解决,但是如果开辟的空间比较多的话,代码就会一层套一层,不是很美观。
2024-07-19 16:58:34 796 2
原创 C++ 异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家 随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;public:{}
2024-07-19 11:13:06 707
原创 Linux-线程同步(条件变量、POSIX信号量)
初始化信号量参数:pshared:0 表示线程间共享,非零表示进程间共享value:信号量初始值,共享资源个数销毁信号量等待信号量//P()功能:等待信号量,会将信号量的值减 1发布信号量//V()功能:发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加 1。张得帅c/Linux基于BlockQueue的生产消费模型基于环形队列的生产消费模型。
2024-07-12 18:29:50 1060 3
原创 Linux—线程互斥
上述代码是一个多线程购票的代码,由于tickets是定义在主线程的栈空间中的,他可以被所有的线程看到,是一个共享资源,这个代码的初衷是让每个线程参与抢票,当票数为0的时候程序停止,但是我们发现运行结果的票数最后竟然出现了负数,这是怎么回事呢?这个期间是可以进行切换的,因为线程虽然被切换走了,但是并没有释放锁,其他线程想要访问临界资源依旧申请不到锁,只有线程释放锁以后其他线程才有机会访问临界区。:每个线程内部,访问临界资源的代码,就叫做临界区,保护临界资源的本质就是保护临界区。Linux 上提供的这把锁叫。
2024-07-10 13:22:11 1083 2
原创 Linux-多线程
由于我们使用的线程接口都是在线程库中维护的,所以我们想创建一个线程的前提是让线程库加载到内存并映射到地址空间,当我们创建一个线程时,pthread库就会在其内部创建一个结构用来管理这个线程,就像我们使用的文件操作,调用fopen函数会返回一个FILE*的结构体,而FILE结构体就是维护在c标准库中的,而tid就是线程库维护的,用于标识每个线程的唯一性,tid是进程级的内核看不到,是用户级的用来让用户操作。,删除一个进程需要删除进程PCB、地址空间、页表等,而删除一个线程只需要删除对应的PCB即可。
2024-07-09 12:59:18 992 1
原创 Linux-页表如何对物理内存进行映射
接下来我们大概计算一下按上述说法一个进程的页表需要多大的内存,页目录1024*4也就是4Kb,页表中索引的是页框的地址,一个地址空间对应的物理内存有2的20次方个页框,所以只需要20个字节就可以索引到所有的页框,那么页表的每个元素只需要3个字节接可以了,一个页表需要3*1024个字节,一共有1024个页表,所以一共需要的大小为4KB+3M的大小(上述大小是大概计算的并不准确)我们知道通过页表可以将虚拟内存映射到对应的物理内存,而操作系统对于物理内存的管理并不是以字节为单位的,而是将物理内存分为许多大小为。
2024-07-04 21:54:24 331 2
原创 C++11新特性【下】{lambda表达式、可变模板参数、包装器}
我们无法直接获取参数包args中的每个参数的, 只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特 点,也是最大的难点,即如何展开可变模版参数。包装器也可以包装类成员函数,不过要添加函数所属类域,在c++中一般还要在类名前加一个&,对于静态成员函数,按照函数声明传参即可,对于非静态成员函数,要注意函数存在一个隐藏的this指针,我们可以传一个对象,也可以传一个对象的地址,底层会根据这个对象或者地址从而找到这个函数。C++中的function本质是一个类模板,也是一个包装器。
2024-07-02 08:15:00 864 2
原创 C++11新特性【上】(统一的列表初始化、auto、decltype、右值引用、万能引用、完美转发)
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞 进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2024-06-10 08:15:00 1014 6
原创 Linux---进程信号(万字详解,建议收藏)
Linux信号万字详解,信号的产生、保存、处理,及阻塞信号,信号的操作集函数、信号捕捉的流程、理解volatile关键字、再次理解进程等待
2024-05-29 08:15:00 1028 2
原创 数据结构--AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
2024-05-15 08:15:00 1944 2
原创 数据结构--红黑树(RBTree)
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,也就是最长路径不超过最短路径的2倍,因而是接近平衡的。思考:在结点的定义中,为什么要将结点的默认颜色给成红色的?
2024-05-15 08:15:00 684
原创 【C++】二叉搜索树(手撕插入、删除、寻找)
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。b、最多查找高度次,走到到空,还没找到,这个值不存在。2.2二叉搜索树的插入插入的具体过程如下:a. 树为空,则直接新增节点,赋值给root指针b. 树不空,按二叉搜索树性质查找插入位置,插入新节点2.3二叉搜索树的删除首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:让父亲节点指向孩子节点的左节点或右节点即可
2024-05-08 21:09:06 1034 2
原创 C++面向对象三大特性之---多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上=0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。
2024-05-07 09:00:00 917 1
原创 C++面向对象三大特性之——继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继 承是类设计层次的复用。例如,一个人有名字、年龄等属性,而一个学生也是人,他就可以直接继承人的特性,再加上自己独有的特性即可。
2024-05-05 09:00:00 1911 2
原创 消息队列与信号量(基本概念及操作接口介绍)
例如,我们将共享内存看做是一份资源,及资源的可用数量为1,当一个进程想要访问该共享内存时,先申请信号量,此时S--,当另一个进程想要访问这个共享内存时,信号量为0,没有可用资源,此时就要等待,直到进程访问完成后释放信号量,等待的进程才可以访问共享内存。信号量要保护临界资源,那它一定要让多个进程可以看到他,及信号量自己本身就是一个共享资源,为了保护信号量自己的安全,信号量的操作(PV)一定是原子的,及要么做要么不做、要么成功要么失败,不会做一半被打断。如果是创建新的信号量集,该参数指定了信号量的数量;
2024-05-04 11:20:17 1238 1
原创 【Linux—进程间通信】共享内存的原理、创建及使用
共享内存是一种计算机编程中的技术,它允许多个进程访问同一块内存区域,以此作为进程间通信(IPC, Inter-Process Communication)的一种方式。这种方式相对于管道、套接字等通信手段,具有更高的效率,因为数据不需要在用户空间和内核空间之间进行复制,也不需要经过序列化和反序列化的复杂过程。特点:高速度:由于省去了数据复制和上下文切换的开销,共享内存提供了非常高的数据交换速度。低延迟:适用于需要快速响应和大数据量传输的场景。同步需求。
2024-05-02 13:13:28 1867 2
原创 Linux-进程间通信(进程间通信介绍、匿名管道原理及代码使用、命名管道原理及代码使用)
数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事( 如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变。
2024-04-30 21:26:21 882 3
原创 【Linux】软硬链接与动静态库(理解软硬链接的特点及使用场景、如何建立动静态库与使用第三方库)
静态库和动态库是计算机程序开发中两种不同的库类型,它们都是预先编译好的二进制代码集合,用于提供可重用的功能模块给其他程序调用。静态库在链接阶段会被完整地加入到最终生成的可执行文件中。当编译器在创建一个程序时,如果程序引用了静态库中的函数或对象,那么静态库中的相关代码会被复制并整合到该程序内部。因此,静态链接后的可执行文件包含了程序运行所需的所有库代码,不需要在运行时依赖外部文件。静态库常见的扩展名有 `.a`(Unix/Linux 系统)或 `.lib`(Windows 系统)。
2024-04-20 16:26:30 1397 3
数据库工具,根据表结构文档生成创建表sql.zip
2024-01-05
贪吃蛇游戏(C语言实现)
2024-01-13
算法与数据结构等 - 知识荟萃 「长期更新中」【欢迎 watch,有兴趣点个 star,千万别 fork !】.zip
2024-01-05
农业领域知识图谱的构建,包括数据爬取(百度百科)、数据分类.zip
2024-01-05
经典编程书籍大全,涵盖:计算机系统与网络.zip
2024-01-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人