自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于Linux的C++轻量级web服务器/webserver/httpserver

WebServer详解使用C++语言,编写了一个基于Linux的HttpServer,能够实现上万的QPS。项目地址:gitee仓库github仓库功能利用I/O多路复用技术的Epoll与线程池实现【单Reactor、多线程】的高并发服务器模型;利用有限状态机和正则解析HTTP请求报文;利用STL标准库容器封装char,实现自定义的缓冲区;基于堆结构实现的定时器,关闭超时的非活跃网络连接;支持GET请求项目详解WebServer项目——webserver详解WebServe

2022-03-09 16:19:29 9566 4

原创 B站-王卓-数据结构课程-学习笔记

使用C++语言实现B站王卓老师的数据结构公开课课程代码chapter 0chapter 1chapter 2chapter 3chapter 4chapter 5使用说明线性表、链表栈、队列[串、数组和广义表]树[图]我的思维导图笔记-欢迎查看使用说明eg.1://ElemType是数据类型别名,常见的有:typedef int ElemType;eg.2://王卓老师视频中常用的结构体定义方式typedef struct{ Elem

2021-02-05 21:20:38 2785 7

原创 main.c从编译到运行到底发生了什么

链接器之所以能够解析不同文件中的函数、变量等信息,是因为程序源文件被编译的过程中,会在符号表中生成用于引用的符号。void foo();return 0;由于函数foo没有定义,直接调用foo如果在多个源文件中,定义了具有相同名字的符号,链接器该作如何选择呢?对于Linux不允许有相同的强符号,比如两个模块中都有main函数,此时会报错;如果有一个强符号和多个弱符号,选择强符号;如果有多个弱符号,任意选择一个;

2023-09-24 22:12:37 487

原创 Web服务器——踩过的坑(一)

面试官:项目开发中有遇到什么苦困难吗?你是如何解决这个困难的?像函数调用错误啊导致的错误排查,这些都不赘述了,只要是写代码的都会遇到。我说说我项目开发中让我印象比较深刻的几个问题吧,同时我也会阐述我针对项目出现的问题我是如何分析的,采用什么方式解决的,最后说说我的心得体会.面试官:好的,请开始你的表演。...

2022-08-18 16:43:21 1585

原创 Redis的消息队列学习笔记

消息队列在项目中使用的目的是降低多机服务器的耦合度,降低了耦合度之后也会降低从单机升级到多机带来的代码改动量。Redis是基于键值对存储的非关系型数据库,其特点为单线程+I/O多路复用,其访问数据的效率非常高。在Redis数据库中一共有三种消息队列的实现方式:List是Redis中的一种基本数据类型,其底层数据结构是双向链表。双向链表可以在两个端口分别进行插入和删除数据的操作,非常适合用于实现消息队列:使用List实现的消息队列具有如下的特点:使用List实现的消息队列具有下面两个不足:总言之,使用List

2022-07-10 00:23:37 816 1

原创 如何正确区分以下四种指针?

如何区分下列四种指针: int *p[10] int (*p)[10] int *p(int) int (*p)(int)

2022-06-04 19:14:43 246

原创 一文搞懂顶层const和底层const

最近在准备秋招,复习到了const。看到了一些关于const的问题和回答。感觉大家在针对const的顶层和底层这个点上说的都不是很清楚。今天想借这个机会和大家一起聊聊顶层const和底层const到底是怎么一回事。

2022-06-02 17:19:35 515 1

原创 一文搞懂C++虚函数的实现原理

虚函数是实现C++中面向对象的三大特性之一——多态的一种技术手段。什么是多态呢?在基类的成员函数前,使用修饰得到的就是虚函数。在派生类中,对继承得到的虚函数,进行重写,使得派生类对继承的方法有了自己的具体实现。在外部函数中,通过基类指针调用类的接口,在程序运行时,会根据指针绑定的对象选择对应的接口,这便是多态。多态简单来说,是让同一种事物有了多种不同的表现。基类指针绑定了类对象后,程序运行时,是怎么知道该运行哪个类的接口函数呢?这便是本篇文章要探究的问题。C++为了实现虚函数的动态绑定,在每一个类(当然是

2022-06-01 17:30:53 3008

原创 基于Linux的C++轻量级web服务器/webserver/httpserver——MySQL数据库的使用

MySQL数据库的使用常见的服务器设计,其结构组成一般都是:I/O处理模块、业务逻辑模块、数据模块。我的另一个项目:chatserver聊天服务器其设计模式也是这样:使用Muduo处理网络I/O,编写业务模块代码、数据代码和业务代码要能够实现分离。这个项目开发的http服务器支持用户的【登陆】和【注册】业务。为了保存用户的登陆名称和密码,采用MySQL数据库进行落地存储。MySQL使用介绍这部分大家自行学习吧。简单的使用掌握就行,对数据库的增删改查命令要熟悉。书籍这边推荐《MySQL必知必会》,

2022-04-21 21:15:45 2396

原创 基于Linux的C++轻量级web服务器/webserver/httpserver——timer定时器

定时器的介绍为了提高Web服务器的效率,我们考虑给每一个HTTP连接加一个定时器。定时器给每一个HTTP连接设置一个过期时间,然后我们定时清理超过过期时间的连接,会减少服务器的无效资源的耗费,提高服务器的运行效率。我们还需要考虑一下如何管理和组织这些定时器。设置定时器的主要目的是为了清理过期连接,为了方便找到过期连接,首先考虑使用优先队列,按过期时间排序,让过期的排在前面就可以了。但是这样的话,虽然处理过期连接方便了,当时没法更新一个连接的过期时间。最后,选择一个折中的方法。用vector容器存储定

2022-04-21 00:35:00 1147 1

原创 基于Linux的C++轻量级web服务器/webserver/httpserver——httpconnect模块介绍

HTTP连接处理详解背景服务器和核心功能是完成对HTTP请求报文的解析,并向客户端发出HTTP响应报文。在Httpconnection模块正是要完成上述的功能需求。为了完成报文解析、资源定位、发送响应等功能需求,该项目一共是写了4个头文件,与此对应的就是4个模块:Httpconnection模块、Httprequest模块、Httpresponse模块以及Buffer缓冲区模块。四个模块之间的相互关系如下图所示[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWaMy8

2022-04-21 00:33:44 1315 1

原创 基于Linux的C++轻量级web服务器/webserver/httpserver——webserver类详解

webserver介绍这个webserver类是对整个web服务器的抽象。在这个类中,调用之前编写的四大模块:Httpconnection类、Epoller类、Timer类以及ThreadPool类完成整个服务器项目的功能。webserver的逻辑第一步是服务器的初始化。在webserver的构造函数中完成对Httpconnection类、Epoller类、Timer类以及ThreadPool类对象的初始化,同时还需要设置好服务器的socket,暴露端口等相关信息 m_port = port;

2022-04-21 00:29:13 3838 2

原创 基于Linux的C++轻量级web服务器/webserver/httpserver——epoller详解

Epoller的介绍epoll是I/O多路复用技术的一种,目前常用的I/O多路复用技术有:epoll、select、poll。I/O多路复用技术可以让服务器同时监听多个客户端发起的socket连接。epoll相较于select和poll,由于其底层的红黑树,不仅可以知道是否有socket通信状态发生了改变,还能够知道有几个socket发生了状态改变。不需要在程序中使用循环遍历所有的socket连接,确定到底是哪一个socket状态发生了改变。这一特点大大提高了服务器监听的效率,也让epoll成为了目前I

2022-04-21 00:27:49 966

原创 基于Linux的C++轻量级web服务器/webserver/httpserver——Buffer缓冲区

Buffer.h在这个项目中,客户端发来的HTTP请求以及回复给客户端所请求的资源,都需要设置缓冲区进行保存。在【牛客网】的项目中,使用了两个char数组用于读取和写入的缓冲区,同时辅以很多指针来完成缓冲区的读写操作。写这个头文件的目的,正是将原有的【牛客网】项目的涉及缓冲区的纷繁的代码整合一下,用C++面向对象的思想创建一个Buffer类,并在类中封装对应的函数和接口下面说一下缓冲区需要完成的功能:向【缓冲区】中写入数据:写入char类型的一块数据写入string类型的一块数据写入void

2022-04-21 00:22:57 1695

原创 基于Linux的C++轻量级web服务器/webserver/httpserver——线程池

1. 背景什么是线程池?线程池技术是池化技术的一种。除了线程池,还是内存池、连接池等其他池化技术。打个比方来说,线程池是将若干个随时可以执行任务的线程放在“池子”这种容器中,当我们要使用线程的时候,从线程池中取出即可;使用完成后再将线程归还给线程池,以便下次或者其他用户使用。本项目为什么需要线程池?使用线程池技术的最大好处**是服务器可以避免因重复的建立和销毁线程带来的开销,**从而提高服务器对客户端的响应速度。此外,一个线程从诞生到结束,在系统中存在的时间可以分成三个阶段:创建耗时t1, 工作时

2022-03-14 21:02:49 4357 2

原创 【牛客网C++服务器项目学习】Day18-编写http_conn.h

day18有限状态机解析http协议什么是有限状态机有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。当逻辑里面有大量判断需要转换状态时,有限状态机就有用处了,本质上其是用查表法来把处理逻辑独立到表中,从而可以用通用的代码去处理任意复杂的状态转换有限状态机的编程并不是一个困难事。更重要的是要理清楚状态转移的逻辑和方式,代码是很好写的。

2022-01-14 00:44:22 1024

原创 【牛客网C++服务器项目学习】Day17-零零散散的知识点记录

day17sigaction函数int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);函数功能:检查或者修改与信号signum相关联的处理动作。函数参数:signum:有效的信号act:指定的新的处理函数。当信号signum发生时,使用act进行处理oldact:传出参数,如果该参数不是NULL,则将之前的响应处理函数进进行保存

2022-01-13 16:32:00 440

原创 【牛客网C++服务器项目学习】Day16-主程序的编写

项目学习地址:【牛客网C++服务器项目学习】day16Linux的信号机制及其使用方式信号是什么?信号是Linux中一种古老的消息通知机制。其主要的作用是告知进程有一个事件结束了。是一种在软件层面对中断的模拟。信号的产生,可分为硬件产生和软件产生。硬件信号不是我们关注的重点,有Ctrl+c触发SIGINT信号,实现终止进程的功能;软件上的产生可以通过kill函数/命令、alarm闹钟函数、abort函数(功能不清楚)重点应该是在【信号注册】上。signal函数typedef void .

2022-01-11 22:54:38 928

原创 【牛客网C++服务器项目学习】Day15-线程池类的编写

项目学习地址:【牛客网C++服务器项目学习】花了三小时,搞定了线程池类的编写,实际测试过了,能够正常跑通。性能测试还没去做,不知道和传统的【即时创建、即时销毁】机制比起来能够快多少。写这个程序还是踩了一些坑,我把我写程序遇到的问题总结一下:使用模板类编写省心。最开始我不愿意使用模板类进行线程池类的开发,想着说用不上。不过很快就遇到了问题:向线程池中添加一个任务——函数,通常需要用结构体封装一下。因为函数做为参数,表达式太长了,有些许不方便。但是将函数封装在结构中,也带来了新的问题:不能将结构.

2022-01-07 00:47:25 1366 1

原创 【牛客网C++服务器项目学习】Day14-线程池类的封装

项目学习地址:【牛客网C++服务器项目学习】day141.环境配置不知道有多少小伙伴和我一样,在之前的.c文件中,包含各种头文件进行编写不会产生报错,但是.h头文件中包含头文件就会报告【找不到源文件】的错误。产生错误的原因很简单:没有安装g++编译器。在linux的终端输入命令yum install gcc-c++即可(我的linux用的是centos)线程池实现线程池的优势:在传统的服务器开发中,面对一个客户端请求,通常是创建一个线程去处理请求,请求结束之后,销毁线程。也就是我们说的“.

2022-01-06 00:56:05 1426 1

原创 【牛客网C++服务器项目学习】Day13-线程同步机制类封装

项目学习地址:【牛客网C++服务器项目学习】day13C++模板类的编写简化编程人员的工作,使得程序员编写的自定义类能够被复用到其他程序代码中去。使用方法:1 - 声明和定义template <typename T> // typename T 该位置可以定义不止一个(map的参数就是两个)class MyClass{ // int sum();};类模板中的成员函数,放在模板类外去定义的写法template <typename T>int.

2022-01-04 00:06:20 1070

原创 【牛客网C++服务器项目学习】Day12-网络编程的两种事件处理模式

项目学习地址:【牛客网C++服务器项目学习】day12本该日更的项目学习进度,因为个人原因导致了拖更。虽然该专栏并没有读者,但是我觉得打乱了自己的计划,属实不该。由于课程【4.20】多进程服务器开发之后的学习笔记在pad上,暂时还没来得及迁移。这篇文章记录的是第五章项目学习的内容。...

2022-01-03 01:21:25 1786 5

原创 【牛客网C++服务器项目学习】-Day11-TCP基本原理

项目学习地址:【牛客网C++服务器项目学习】day 12TCP的通信:1.TCP通信的过程TCP协议作为传输层的协议,承担的任务是实现不同主机之间端-端的通信。在应用层上的协议,如http、ftp协议都是通过TCP协议完成可靠传输的。在我们使用例如,xftp这类软件进行文件传输时,看不见的背后是每一次进行传输,都会在通信的双方之间建立TCP连接,TCP通信的过程大致是这样的:建立连接:三次握手的过程。第一次握手:客户端发起连接。客户端会向服务端送请求连接的TCP报文。请求连接的T.

2021-12-17 00:39:35 1796

原创 【牛客网C++服务器项目学习】-Day11-socket编程的相关API函数

项目学习地址:【牛客网C++服务器项目学习】day 11socket通信过程:1.socket函数int socket(int domain, int type, int protocol);功能: - 创建一个文件描述符用于主机之间端对端的通信参数: - domain:domain是指定一个协议族用于通信,能够使用的协议族在头文件<sys/socket.h>中被定义好了: - AF_UNIX, AF_LOCAL Local communication .

2021-12-15 22:43:31 3910

原创 【牛客网C++服务器项目学习】-Day10-字节序、socket地址结构、IP地址转换函数

项目学习地址:【牛客网C++服务器项目学习】day101.socketsocket是介于应用层和传输层的一种对外的接口。socket是网络间主机通信的API,它将传输层及其以下的网络层次都封装了,在应用层通过编写和调用socket函数即可实现对两个主机上进行通信。2.字节序节序,就是 多字节(大于一个字节)类型的数据在内存中的存放顺序。是在跨平台和网络编程中,时常要考虑的问题。字节序经常被分为两类:\1. Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地.

2021-12-15 00:06:52 3405

原创 【牛客网C++服务器项目学习】-Day09-网络模型个人总结

项目学习地址:【牛客网C++服务器项目学习】day09项目学习进入了第四章——网络编程。这一章的学习,前半段是对计算机网络体系进行一个大致的讲解。我自己在今年4月份系统性的看了《计算机网络自顶向下》以及中科大郑诠老师的视频。可是,碍于计网的学习主要以知识概念为主,很多知识学过一遍后就忘记了,在脑子中根本就记不住。现在项目既然复习到了这,我觉得有必要自己在文档中,用自己的语言,有条理的归纳一些计网的知识概念。这样做的好处有两个,一是可以帮助自己梳理知识、二是可以加深对某些知识的记忆。知识点的总结按照.

2021-12-13 23:43:09 3951

原创 【牛客网C++服务器项目学习】Day8.5-自己的一点心得体会

项目学习地址:【牛客网C++服务器项目学习】day09线程部分,自己用库函数,实现了一个信号量控制线程同步对临界区数据的读取和写入信号量,顾名思义,表示信号的一个变量。学完了线程,我们知道线程之间是共享内存资源,这就会带来冲突的问题,由此引出了临界区和锁的概念信号量与之前的互斥锁、读写锁有一个很大的不同:锁是一个开关,它只能表示对当前保护的对象,开权限或者关权限,它不能表示当前受保护的对象,资源的数量。信号量就是实现对受保护对象资源数量的表示的功能信号量函数中的sem_wait()函数.

2021-12-13 00:37:59 697

原创 【牛客网C++服务器项目学习】Day8-线程相关、线程锁、条件变量、信号量

项目学习地址:【牛客网C++服务器项目学习】day08函数:void pthread_exit(void *retval);功能:终止调用这个函数的线程。如果是一个进程的最后一个线程调用该函数,那么该进程会执行调用exit(3)终止该进程。此外,一个线程终止了,并不会影响线程共享的资源:文件描述符等。参数:retval:这个参数是传递出去给另一个函数Pthread_join的返回值:没有返回值,这个函数总会执行成功函数:int pthread_equal(pth.

2021-12-11 23:59:30 1190

原创 【牛客网C++服务器项目学习】Day7-共享内存,守护进程,线程创建

项目学习地址:【牛客网C++服务器项目学习】day07共享内存进程可以将同一段共享内存连接到它们自己的地址空间,所有进程都可以访问共享内存中的地址,如果某个进程向共享内存内写入数据,所做的改动将立即影响到可以访问该共享内存的其他所有进程。相关接口创建共享内存:int shmget(key_t key, int size, int flag);成功时返回一个和key相关的共享内存标识符,失败范湖范围-1。key:为共享内存段命名,多个共享同一片内存的进程使用同一个key。.

2021-12-10 23:17:08 1440

原创 【牛客网C++服务器项目学习】Day6-有名管道、内存映射、信号机制

项目学习地址:【牛客网C++服务器项目学习】有名管道:有名管道特点:有名管道是FIFO文件,存在于文件系统中,可以通过文件路径名来指出。管道文件仅仅是文件系统中的标示,并不在磁盘上占据空间。在使用时,在内存上开辟空间,作为两个进程数据交互的通道。有名管道可以在不具有亲缘关系的进程间进行通信。相关接口:在shell中使用mkfifo 命令mkfifo filenameint mkfifo(const char *pathname, mode_t mod.

2021-12-10 00:57:18 1205

原创 【牛客网C++服务器项目学习】Day5-linux下的进程相关

day051.Linux中查看进程信息ls /proc/前面蓝色数字代表的进程的ID。如果你想查看PID为1的进程信息,你需要查看/porc/1这个文件夹我们也可以使用ps -ef -aux指令来直接显示进程状态或者使用ps aux/aujtop:动态显示进程状态kill:杀死进程插一嘴:今天在腾讯云上开了一个云服务器用于替代VMware虚拟机,由于腾讯云的centos7.6安装的gcc版本为4.8.5,默认不支持c99以后的标准,这带来的问题就是,c99之前的标准不

2021-12-09 00:12:56 1038

原创 【牛客网C++服务器项目学习】Day4-Linux系统的文件操作相关函数(open、read、opendir、fcntl等)

day041.open函数open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要的文件的属性和用户权限等各种参数。open函数定义:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags,

2021-12-08 00:36:58 2078

原创 【牛客网C++服务器项目学习】Day3-GDB、I/O库函数、虚拟内存、文件描述符

Day3-GDB、I/O库函数、虚拟内存、文件描述符

2021-12-07 00:12:53 841

原创 【牛客网C++服务器项目学习】Day2-动态库、Makefile

Day2-动态库、Makefile

2021-12-06 00:23:03 949 2

原创 【牛客网C++服务器项目学习】Day1-配置环境、GCC、静态链库

第一天的笔记

2021-12-05 19:55:10 2206

转载 哈工大-操作系统-HitOSlab-李治军-实验7-终端设备的控制

实验7-终端设备的控制实验内容请查看实验指导手册绪论根据题目的要求,可以想到一共需要改两个地方:第一个地方:我们首先需要把F12原有的功能屏蔽掉,然后改成我们要用到的“开关”功能,即设定一个变量flag表示开关标记,按一次F12后flag变成1,再按一次flag变成0,再按又变成1。第二个地方:在字符输出到显示器前,根据flag的值来决定显示正常字符或者显示*字符。一、实验内容(1)修改linux-0.11/kernel/chr_drv/keyboard.S文件正常情况下在linux0.

2021-09-23 21:23:14 818 1

原创 哈工大-操作系统-HitOSlab-李治军-实验6-内存映射和共享

实验6-内存映射和共享实验内容请查看实验指导手册绪论一、实验内容1.跟踪地址翻译过程(1)准备在Ubuntu的终端中通过sudo ./mount-hdc命令挂载虚拟机,在(hdc/usr/root)目录下新建test.c,代码如下:#include <stdio.h>int i = 0x12345678;int main(void){ printf("The logical/virtual address of i is 0x%08x", &i);

2021-09-05 22:04:33 1302 1

原创 哈工大-操作系统-HitOSlab-李治军-实验0-在自己电脑上搭建实验环境

哈工大李治军老师的操作系统实验课程是一门不可多得的好课程,该课程基于linux0.11让学生们编写代码实现:系统启动、系统调用、进程切换、内核级线程等操作系统的基本功能。这个课程在蓝桥云课上有对应的在线虚拟机系统。不过,该系统单次只能运行60分钟,如果要连续长时间使用,需要不断延时,错过延时系统就会关闭,之前做的进度无法保存,所以很多小伙伴会选择在自己的电脑上搭载相应的实验环境,方便随时随地进行实验。第一步:在自己电脑上通过VMware安装Ubuntu系统首先,下载VMware虚拟机软件;然后,去.

2021-08-17 15:31:56 5382 20

原创 哈工大-操作系统-HitOSlab-李治军-实验5-信号量的实现和应用

实验5-信号量的实现和应用实验内容请查看操作系统实验指导手册

2021-08-17 15:26:55 2423 11

原创 哈工大-操作系统-HitOSlab-李治军-实验4-基于内核栈切换的进程切换

实验4-基于内核栈切换的进程切换实验内容请查看蓝桥云课实验说明参考文献:1.哈工大实验“官方”github仓库2.蓝桥云课-操作系统原理与实践

2021-08-01 21:59:28 3004 14

空空如也

空空如也

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

TA关注的人

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