服务器项目学习
文章平均质量分 83
牛客网高性能服务器开发项目学习。
学这个项目,目的在于进一步了解在Linux上进行网络编程开发需要用的知识点以及技能,例如面试题中常见的epoll、I/O多路复用等,这些我在基础知识的书籍上都还没见到过。。。
这个项目只是一个起点,学无止境,大家一起共勉~
garbage_man
持续进步中!
展开
-
Web服务器——踩过的坑(一)
面试官:项目开发中有遇到什么苦困难吗?你是如何解决这个困难的?像函数调用错误啊导致的错误排查,这些都不赘述了,只要是写代码的都会遇到。我说说我项目开发中让我印象比较深刻的几个问题吧,同时我也会阐述我针对项目出现的问题我是如何分析的,采用什么方式解决的,最后说说我的心得体会.面试官:好的,请开始你的表演。...原创 2022-08-18 16:43:21 · 1954 阅读 · 0 评论 -
Redis的消息队列学习笔记
消息队列在项目中使用的目的是降低多机服务器的耦合度,降低了耦合度之后也会降低从单机升级到多机带来的代码改动量。Redis是基于键值对存储的非关系型数据库,其特点为单线程+I/O多路复用,其访问数据的效率非常高。在Redis数据库中一共有三种消息队列的实现方式:List是Redis中的一种基本数据类型,其底层数据结构是双向链表。双向链表可以在两个端口分别进行插入和删除数据的操作,非常适合用于实现消息队列:使用List实现的消息队列具有如下的特点:使用List实现的消息队列具有下面两个不足:总言之,使用List原创 2022-07-10 00:23:37 · 962 阅读 · 1 评论 -
基于Linux的C++轻量级web服务器/webserver/httpserver——MySQL数据库的使用
MySQL数据库的使用常见的服务器设计,其结构组成一般都是:I/O处理模块、业务逻辑模块、数据模块。我的另一个项目:chatserver聊天服务器其设计模式也是这样:使用Muduo处理网络I/O,编写业务模块代码、数据代码和业务代码要能够实现分离。这个项目开发的http服务器支持用户的【登陆】和【注册】业务。为了保存用户的登陆名称和密码,采用MySQL数据库进行落地存储。MySQL使用介绍这部分大家自行学习吧。简单的使用掌握就行,对数据库的增删改查命令要熟悉。书籍这边推荐《MySQL必知必会》,原创 2022-04-21 21:15:45 · 2482 阅读 · 0 评论 -
基于Linux的C++轻量级web服务器/webserver/httpserver——timer定时器
定时器的介绍为了提高Web服务器的效率,我们考虑给每一个HTTP连接加一个定时器。定时器给每一个HTTP连接设置一个过期时间,然后我们定时清理超过过期时间的连接,会减少服务器的无效资源的耗费,提高服务器的运行效率。我们还需要考虑一下如何管理和组织这些定时器。设置定时器的主要目的是为了清理过期连接,为了方便找到过期连接,首先考虑使用优先队列,按过期时间排序,让过期的排在前面就可以了。但是这样的话,虽然处理过期连接方便了,当时没法更新一个连接的过期时间。最后,选择一个折中的方法。用vector容器存储定原创 2022-04-21 00:35:00 · 1252 阅读 · 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 · 1437 阅读 · 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 · 4072 阅读 · 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 · 1056 阅读 · 0 评论 -
基于Linux的C++轻量级web服务器/webserver/httpserver——Buffer缓冲区
Buffer.h在这个项目中,客户端发来的HTTP请求以及回复给客户端所请求的资源,都需要设置缓冲区进行保存。在【牛客网】的项目中,使用了两个char数组用于读取和写入的缓冲区,同时辅以很多指针来完成缓冲区的读写操作。写这个头文件的目的,正是将原有的【牛客网】项目的涉及缓冲区的纷繁的代码整合一下,用C++面向对象的思想创建一个Buffer类,并在类中封装对应的函数和接口下面说一下缓冲区需要完成的功能:向【缓冲区】中写入数据:写入char类型的一块数据写入string类型的一块数据写入void原创 2022-04-21 00:22:57 · 1883 阅读 · 0 评论 -
基于Linux的C++轻量级web服务器/webserver/httpserver——线程池
1. 背景什么是线程池?线程池技术是池化技术的一种。除了线程池,还是内存池、连接池等其他池化技术。打个比方来说,线程池是将若干个随时可以执行任务的线程放在“池子”这种容器中,当我们要使用线程的时候,从线程池中取出即可;使用完成后再将线程归还给线程池,以便下次或者其他用户使用。本项目为什么需要线程池?使用线程池技术的最大好处**是服务器可以避免因重复的建立和销毁线程带来的开销,**从而提高服务器对客户端的响应速度。此外,一个线程从诞生到结束,在系统中存在的时间可以分成三个阶段:创建耗时t1, 工作时原创 2022-03-14 21:02:49 · 4492 阅读 · 2 评论 -
基于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 · 10004 阅读 · 4 评论 -
【牛客网C++服务器项目学习】Day18-编写http_conn.h
day18有限状态机解析http协议什么是有限状态机有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。当逻辑里面有大量判断需要转换状态时,有限状态机就有用处了,本质上其是用查表法来把处理逻辑独立到表中,从而可以用通用的代码去处理任意复杂的状态转换有限状态机的编程并不是一个困难事。更重要的是要理清楚状态转移的逻辑和方式,代码是很好写的。原创 2022-01-14 00:44:22 · 1087 阅读 · 0 评论 -
【牛客网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 · 504 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day16-主程序的编写
项目学习地址:【牛客网C++服务器项目学习】day16Linux的信号机制及其使用方式信号是什么?信号是Linux中一种古老的消息通知机制。其主要的作用是告知进程有一个事件结束了。是一种在软件层面对中断的模拟。信号的产生,可分为硬件产生和软件产生。硬件信号不是我们关注的重点,有Ctrl+c触发SIGINT信号,实现终止进程的功能;软件上的产生可以通过kill函数/命令、alarm闹钟函数、abort函数(功能不清楚)重点应该是在【信号注册】上。signal函数typedef void .原创 2022-01-11 22:54:38 · 992 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day15-线程池类的编写
项目学习地址:【牛客网C++服务器项目学习】花了三小时,搞定了线程池类的编写,实际测试过了,能够正常跑通。性能测试还没去做,不知道和传统的【即时创建、即时销毁】机制比起来能够快多少。写这个程序还是踩了一些坑,我把我写程序遇到的问题总结一下:使用模板类编写省心。最开始我不愿意使用模板类进行线程池类的开发,想着说用不上。不过很快就遇到了问题:向线程池中添加一个任务——函数,通常需要用结构体封装一下。因为函数做为参数,表达式太长了,有些许不方便。但是将函数封装在结构中,也带来了新的问题:不能将结构.原创 2022-01-07 00:47:25 · 1528 阅读 · 1 评论 -
【牛客网C++服务器项目学习】Day14-线程池类的封装
项目学习地址:【牛客网C++服务器项目学习】day141.环境配置不知道有多少小伙伴和我一样,在之前的.c文件中,包含各种头文件进行编写不会产生报错,但是.h头文件中包含头文件就会报告【找不到源文件】的错误。产生错误的原因很简单:没有安装g++编译器。在linux的终端输入命令yum install gcc-c++即可(我的linux用的是centos)线程池实现线程池的优势:在传统的服务器开发中,面对一个客户端请求,通常是创建一个线程去处理请求,请求结束之后,销毁线程。也就是我们说的“.原创 2022-01-06 00:56:05 · 1481 阅读 · 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 · 1132 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day12-网络编程的两种事件处理模式
项目学习地址:【牛客网C++服务器项目学习】day12本该日更的项目学习进度,因为个人原因导致了拖更。虽然该专栏并没有读者,但是我觉得打乱了自己的计划,属实不该。由于课程【4.20】多进程服务器开发之后的学习笔记在pad上,暂时还没来得及迁移。这篇文章记录的是第五章项目学习的内容。...原创 2022-01-03 01:21:25 · 1949 阅读 · 5 评论 -
【牛客网C++服务器项目学习】-Day11-TCP基本原理
项目学习地址:【牛客网C++服务器项目学习】day 12TCP的通信:1.TCP通信的过程TCP协议作为传输层的协议,承担的任务是实现不同主机之间端-端的通信。在应用层上的协议,如http、ftp协议都是通过TCP协议完成可靠传输的。在我们使用例如,xftp这类软件进行文件传输时,看不见的背后是每一次进行传输,都会在通信的双方之间建立TCP连接,TCP通信的过程大致是这样的:建立连接:三次握手的过程。第一次握手:客户端发起连接。客户端会向服务端送请求连接的TCP报文。请求连接的T.原创 2021-12-17 00:39:35 · 1876 阅读 · 0 评论 -
【牛客网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 · 3948 阅读 · 0 评论 -
【牛客网C++服务器项目学习】-Day10-字节序、socket地址结构、IP地址转换函数
项目学习地址:【牛客网C++服务器项目学习】day101.socketsocket是介于应用层和传输层的一种对外的接口。socket是网络间主机通信的API,它将传输层及其以下的网络层次都封装了,在应用层通过编写和调用socket函数即可实现对两个主机上进行通信。2.字节序节序,就是 多字节(大于一个字节)类型的数据在内存中的存放顺序。是在跨平台和网络编程中,时常要考虑的问题。字节序经常被分为两类:\1. Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地.原创 2021-12-15 00:06:52 · 3466 阅读 · 0 评论 -
【牛客网C++服务器项目学习】-Day09-网络模型个人总结
项目学习地址:【牛客网C++服务器项目学习】day09项目学习进入了第四章——网络编程。这一章的学习,前半段是对计算机网络体系进行一个大致的讲解。我自己在今年4月份系统性的看了《计算机网络自顶向下》以及中科大郑诠老师的视频。可是,碍于计网的学习主要以知识概念为主,很多知识学过一遍后就忘记了,在脑子中根本就记不住。现在项目既然复习到了这,我觉得有必要自己在文档中,用自己的语言,有条理的归纳一些计网的知识概念。这样做的好处有两个,一是可以帮助自己梳理知识、二是可以加深对某些知识的记忆。知识点的总结按照.原创 2021-12-13 23:43:09 · 4210 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day8.5-自己的一点心得体会
项目学习地址:【牛客网C++服务器项目学习】day09线程部分,自己用库函数,实现了一个信号量控制线程同步对临界区数据的读取和写入信号量,顾名思义,表示信号的一个变量。学完了线程,我们知道线程之间是共享内存资源,这就会带来冲突的问题,由此引出了临界区和锁的概念信号量与之前的互斥锁、读写锁有一个很大的不同:锁是一个开关,它只能表示对当前保护的对象,开权限或者关权限,它不能表示当前受保护的对象,资源的数量。信号量就是实现对受保护对象资源数量的表示的功能信号量函数中的sem_wait()函数.原创 2021-12-13 00:37:59 · 736 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day8-线程相关、线程锁、条件变量、信号量
项目学习地址:【牛客网C++服务器项目学习】day08函数:void pthread_exit(void *retval);功能:终止调用这个函数的线程。如果是一个进程的最后一个线程调用该函数,那么该进程会执行调用exit(3)终止该进程。此外,一个线程终止了,并不会影响线程共享的资源:文件描述符等。参数:retval:这个参数是传递出去给另一个函数Pthread_join的返回值:没有返回值,这个函数总会执行成功函数:int pthread_equal(pth.原创 2021-12-11 23:59:30 · 1269 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day7-共享内存,守护进程,线程创建
项目学习地址:【牛客网C++服务器项目学习】day07共享内存进程可以将同一段共享内存连接到它们自己的地址空间,所有进程都可以访问共享内存中的地址,如果某个进程向共享内存内写入数据,所做的改动将立即影响到可以访问该共享内存的其他所有进程。相关接口创建共享内存:int shmget(key_t key, int size, int flag);成功时返回一个和key相关的共享内存标识符,失败范湖范围-1。key:为共享内存段命名,多个共享同一片内存的进程使用同一个key。.原创 2021-12-10 23:17:08 · 1483 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day6-有名管道、内存映射、信号机制
项目学习地址:【牛客网C++服务器项目学习】有名管道:有名管道特点:有名管道是FIFO文件,存在于文件系统中,可以通过文件路径名来指出。管道文件仅仅是文件系统中的标示,并不在磁盘上占据空间。在使用时,在内存上开辟空间,作为两个进程数据交互的通道。有名管道可以在不具有亲缘关系的进程间进行通信。相关接口:在shell中使用mkfifo 命令mkfifo filenameint mkfifo(const char *pathname, mode_t mod.原创 2021-12-10 00:57:18 · 1277 阅读 · 0 评论 -
【牛客网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 · 1100 阅读 · 0 评论 -
【牛客网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 · 2235 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day3-GDB、I/O库函数、虚拟内存、文件描述符
Day3-GDB、I/O库函数、虚拟内存、文件描述符原创 2021-12-07 00:12:53 · 892 阅读 · 0 评论 -
【牛客网C++服务器项目学习】Day2-动态库、Makefile
Day2-动态库、Makefile原创 2021-12-06 00:23:03 · 1008 阅读 · 2 评论 -
【牛客网C++服务器项目学习】Day1-配置环境、GCC、静态链库
第一天的笔记原创 2021-12-05 19:55:10 · 2308 阅读 · 0 评论