从零开始制作一个Webserver
文章平均质量分 89
本专栏记录笔者自2024年起,真正意义上的从零开始制作一个webserver
meeiuliuus
真理无穷,进一步有进一步的欢喜
展开
-
C++ Webserver从零开始全流程记录
到现在为止,这个专栏的十七篇文章已经差不多全部写完了。我现在的心情说不上来,有些许疲倦,有些许释然。我以为已经过了很长的时间,但回想起来也不过就是一个月多的时间。这一路做过来,碰到了非常多的问题,包括我在专栏里记录过的解决程序段错误的问题在内,可以说这样的问题数都数不完,我也因为要解决遇到的这些乱七八糟的错误,搜索了非常多的资料,学习了很多的工具。现在想来这也是一种锻炼吧。原创 2024-02-28 21:37:04 · 4139 阅读 · 1 评论 -
C++ Webserver从零开始:代码书写(十六)——配置文件,服务器,启动!
现在是2024年2月28日的晚上20点36分,我完成了博客的所有内容。现在我整个人有一种如释重负的感觉,今天用webbench测试的时候还闹了个笑话,我在使用测试命令时,url多写了一个http://没注意,导致webbench访问服务器一直被拒,我一度以为是我代码有问题。还跑到群里,社区里求助,也给我一个同学发了过去。网上也搜索了很久,甚至我还跑去看webbench的源码。但是显而易见地一无所获。原创 2024-02-28 20:46:09 · 1572 阅读 · 0 评论 -
C++ Webserver从零开始:代码书写(十五)——封装Webserver类
到目前为止,我们可以算是完成了百分之八十的内容。从最底层的Locker类,到中间的threadpool类,到现在的Webserver类封装。这一路下来,我们基本上了解了一个Webserver该有的内容,这个项目对我来说意义很大,这是我第一次写如此大规模的代码,差不多有3000行,虽然很困难,但是它真的帮助我学到了很多知识。以前学语言学知识,只喜欢看,不喜欢写,现在我渐渐发现了写代码的乐趣。这不会是我最后一个项目,之后如果我还有时间,应该会继续记录我做项目的过程。原创 2024-02-28 16:46:32 · 1577 阅读 · 0 评论 -
C++ Webserver从零开始:代码书写(十四)——http连接处理
HTTP类是Webserver到目前为止最为庞大的类。其实最开始我是只想分析它的部分代码,但是最后我还咬咬牙将http连接处理的全代码分析写完了。因此,本文会特别的长,我相信没人可以把它一口气全部读完。不过我在本文中进行了细致的目录划分,除了头文件,我将http连接处理分为了 接收连接 处理连接 响应连接,大家如果嫌长,就一个部分一个部分看吧。手机端用户可以直接用下方的目录功能,PC端用户按住ctrl + 鼠标滚轮 把页面缩小一点,目录就出来了。原创 2024-02-27 21:14:58 · 1722 阅读 · 2 评论 -
C++ Webserver从零开始:代码书写(十三)——半同步/半反应堆线程池
这篇文章是我在学校图书馆写的,到校已经两天了,这两天我都在图书馆里度过。昨天晚上睡觉前一直在思考昨天学习的东西,结果越思考越睡不着,最后也不知道几点睡着的。今天早上又是七点多起床,来图书馆上午写了两个算法。到了中午脑袋就疼的不行。可能是个人体质差异,我从小就嗜睡,一天只要不睡满8~9个小时,整个身体都会发出“哀鸣”,从头到胸腔,哪里都在抗议在疼痛。原创 2024-02-27 14:15:48 · 1531 阅读 · 2 评论 -
C++ Webserver从零开始:代码书写(十二)——双向链表处理非活动连接
大家好,如题,今天我们来写定时器的代码。更正一下上一章的结束语哈哈哈,因为我发现相比于线程池,定时器类是相对底层的东西。不知道大家有没有玩过有建筑系统的游戏,比如mc,幻兽帕鲁这些,在我看来写一个项目和搭一个房子有一些共通之处,而根据我的经验,就是如果你建房子不把一层搭完,就直接往上盖二层,一旦你突然想在一层内上再划一片区域用来修新的的建筑,那么你新区域与原本的区域之间的一些联动就会比较难设计。原创 2024-02-26 13:37:32 · 1249 阅读 · 2 评论 -
Webserver解决segmentation fault(core dump)段错问问题
在完成了整个项目后,我用make命令编译了server,当我运行./server文件时,出现了段错误在大量的代码中找出错因并不是一件容易的事,尤其是对新手程序员来说。而寻找bug的过程就像是侦探调查线索追查凶手一样,我们要通过一点一点的蛛丝马迹来剥离表象,找到真凶。今天,就由我来扮演一次侦探,调查一番这个段错误到底出自谁手。原创 2024-02-25 11:12:00 · 1427 阅读 · 4 评论 -
C++ Webserver从零开始:代码书写(十一)——封装数据库连接池
Hello大家好,今晚睡不着,起来写博客了。其实我发现上一篇文章也就是C++ Webserver从零开始:代码书写(十)——完成Locker类和Log类封装-CSDN博客的可读性不是很好,这主要原因是因为我写博客主要使用的工具是语雀。而在语雀上编辑完后,复制到csdn上会少很多结构和UI上的东西。比如高亮块,给每个高亮块的颜色区分,代码块命名等。但每次我写完博客后往往处于十分疲惫的阶段,也就直接发上来发布就不管了。现在看起来非常影响可读性,但是我现在实在没有多余的精力去重新排版和规划。原创 2024-02-21 09:54:49 · 2143 阅读 · 2 评论 -
C++ Webserver从零开始:代码书写(十)——完成Locker类和Log类封装
这是我们正式开始写代码的第一章,经历了前面那么多的内容,我们终于可以上手写代码了。前面那么多基础知识,如果大家都看了,理解了更好。如果说看的一知半解也不用担心,基础知识是学不完的,而且如果不加以使用,那么你学的基础知识就会非常快的忘掉。只有将学到东西拿来用,才能真正地掌握。但是基础知识又不能没有,不然写项目的过程中会非常痛苦,你会发现你基本每一行代码都不知道是什么意思,然后再去查回来再写,就非常容易掉进局部的细节里出不来,而无法纵观全局,领会项目的设计思想和代码结构。原创 2024-02-20 17:22:45 · 2480 阅读 · 0 评论 -
C++ Webserver从零开始:配置环境(九)——Linux环境下配置
大家好,我又来更新Webserver的博客了。上一次更新这个专栏时2024.2.5号,离现在已经13天了。非常抱歉,中间隔了那么久。一方面是基础知识学完之后,就要开始自己写代码了。看基础知识和写代码是两回事,理论和实践的区别还是非常大的。所以我对自己的要求是要完成一部分的内容才能开始着手写博客,避免自己的Webserver还没做出点样子就来误人子弟。虽然不能保证自己的博客质量要达到多么多么高,但至少要对得起自己,不能敷衍自己。这是我对自己的要求。原创 2024-02-18 16:57:43 · 2539 阅读 · 5 评论 -
C++ Webserver从零开始:基础知识(八)——多线程编程
现代Linux系统主要使用的线程库是NPTL,在Linux中可以通过获取Linux线程库版本。谈到线程,就不得不提及线程模型。原创 2024-02-05 18:08:01 · 1570 阅读 · 1 评论 -
C++ Webserver从零开始:基础知识(七)——多进程编程
在学习操作系统时,我们知道现代计算机往往都是多进程多线程的,多进程和多线程技术能大大提高了CPU的利用率,因此在web服务器的设计中,不可避免地要涉及到多进程多线程技术。这一章将简要讲解web服务器中的多进程编程,本文不会很详细,也不会在原理性的知识上多费笔墨。如果读者有什么不理解的地方,建议学习一下操作系统的基础知识。原创 2024-02-01 23:29:03 · 1418 阅读 · 0 评论 -
C++ Webserver从零开始:基础知识(六)——定时器
在服务器程序中,每过一段固定的时间触发某段代码,由该代码处理一个事件,如:从内核事件表中删除事件并关闭文件描述符,释放连接支援Linux的定时机制(方法):socket选项SO_RCVTIMEO和SO_SNDTIMEO。原创 2024-01-24 19:26:33 · 1758 阅读 · 0 评论 -
C++ Webserver从零开始:基础知识(五)——信号
Linux系统中,信号是一种通信的方式,其通常用作用户,系统或进程给目标进程发送的信息。信号的作用:通知目标进程某个状态的改变或系统异常。对于终端程序:可以是用户输入的特殊的终端字符,比如ctrl+c是中断信号系统异常,如浮点异常或非法内存访问系统状态变化用户运行kill命令或程序调用kill函数程序必须处理(忽略可以算作处理的一种)一些常见信号。原创 2024-01-22 20:54:26 · 952 阅读 · 0 评论 -
C++ Webserver从零开始:基础知识(四)——I/O复用
在第三章中我们大概地讲解了什么是I/O复用,即:I/O复用技术即使用select,poll,epoll等系统调用,让主线程能同时监听多个文件描述符,提高服务器运行的效率。PS: 虽然I/O复用能同时监听多个文件描述符,但是其本身是阻塞的,当主线程已经监听到多个文件描述符时,如果不采用并发技术,那么程序也只能按顺序一个一个去处理这些文件描述符。原创 2024-01-16 15:20:12 · 1497 阅读 · 0 评论 -
C++ Webserver从零开始:基础知识(三)——Linux服务器程序框架
这一章是整个专栏的核心,也是后续章节的总览。这一章我们会从宏观角度上概括,解释,分析Webserver的各个部分。分析原理,搭建网络,将一个高性能Webserver的各个部分串联起来。可以说,如果没有彻底看懂这一章的内容,那么后面的学习都如同雾里看花,甚至不知道在干嘛,唯有将框架了解清楚,才知道什么地方该填入正确的血肉。同时,这一章内容也是面试的各大高频考点。原创 2024-01-14 17:24:15 · 2684 阅读 · 3 评论 -
C++ Webserver从零开始:基础知识(二)——高级I/O函数
本章将介绍一部分Linux高级I/O函数,这部分函数我不会像第一章那样每个参数都去介绍它的作用,因为它们并不像基础API那样经常使用但是这一章的API可以大大提高最终Webserver的工作效率,所以我会简要介绍每个函数的大概作用。读者在了解这一章的内容时可以初略看看,了解他们的作用,看到别人写了该API知道它的作用即可,等自己上手的时候再去搜索具体写法也不迟。原创 2024-01-13 16:12:35 · 1193 阅读 · 1 评论 -
C++ Webserver从零开始:基础知识(一)——Linux网络编程基础API
主机之间的通信需要知晓对方的地址,而网络中主机的地址是TCP/IP协议族来定义的(计算机网络基础知识),在Linux网络编程中,我们通过使用socket的这个套接字来进行网络通信。我们在二到七的过程中完整经历了socket通信的创建,命名,监听,接受(发起),关闭的过程,在连接建立成功到关闭连接的这个时间段中我们就可以进行两个主机之间的通信。我们知道,一个32位计算机的CPU累加器一次能累加4字节的数据,而这4字节的数据在内存中排列的顺序是可以有2种方式的,即大端字节序和小端字节序。原创 2024-01-12 18:00:00 · 2989 阅读 · 2 评论