用C++实现的高性能WEB服务器,经过webbenchh压力测试可以实现上万的QPS 项目地址:https://github.com/Aged-cat/WebServer 功能 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型; 利用正则与状态机解析HTTP请求报文,实现处理静态资源的请求; 利用标准库容器封装char,实现自动增长的缓冲区; 基于堆结构实现的定时器,关闭超时的非活动连接; 改进了线程池的实现,QPS提升了45%+; 项目详解 WebServer项目——buffer详解 Web…

2021年6月6日 2条评论 432点热度 5人点赞 agedcat_xuanzai 阅读全文

webserver介绍 这个webserver类是对整个web服务器的抽象,基于HTTPconnection类、timer类、epoller类、threadpool类实现一个完整的高性能web服务器的所有功能。 需要满足的功能有: 初始化服务器,为HTTP的连接做好准备; 处理每一个HTTP连接; 用定时器给每一个HTTP连接定时,并且处理掉过期的连接; 运用IO多路复用技术提升IO性能; 运用线程池技术提升服务器性能; webserver的逻辑 首先是进行服务器的初始化,进行各种参数设置。其中包括了事件模式的初始…

2021年6月6日 1条评论 526点热度 1人点赞 agedcat_xuanzai 阅读全文

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

2021年6月6日 0条评论 427点热度 0人点赞 agedcat_xuanzai 阅读全文

HTTPresponse简介 这个类和HTTPrequest相反,是给相应的连接生成相应报文的。HTTPrequest是解析请求行,请求头和数据体,那么HTTPresponse就是生成请求行,请求头和数据体。 HTTPresponse的组成 所需变量和自定义的数据结构 首先,我们需要一个变量code_来代表HTTP的状态。 在HTTPrequest中解析到的路径信息是相对路径,我们还需要补全,所以需要一个变量path_代表解析得到的路径,一个变量srcDir_表示根目录,除此之外,我们还需要一个哈希表提供4XX状态…

2021年6月6日 0条评论 263点热度 2人点赞 agedcat_xuanzai 阅读全文

HTTPrequest简介 这个类主要的功能是解析HTTP的请求信息。 HTTP的请求包括:请求行(request line)、请求头部(header)、空行 和 请求数据 四个部分组成。 抓包的request结构如下: GET /mix/76.html?name=kelvin&password=123456 HTTP/1.1 Host: www.fishbay.cn Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel…

2021年6月6日 0条评论 476点热度 0人点赞 agedcat_xuanzai 阅读全文

HTTPconnection简介 这个类就是对一个HTTP连接的抽象,负责对一个HTTP请求的解析和回复,以及提供读写的接口。 这个读写接口的底层就是靠buffer缓冲区来实现的,这个缓冲区提供了读写的接口。但是,写借口照样用了分散写的方法实现。然后就是对从socket连接中读取的数据进行解析,以及对请求做出响应。这部分的实现主要依赖于HTTPrequest和HTTPresponse来完成。 HTTPconnection组成 其中的构造函数和析构函数略去不谈,缺省就可以。 所需变量和自定义的数据结构 对于一个HTT…

2021年6月6日 0条评论 486点热度 0人点赞 agedcat_xuanzai 阅读全文

epoller的简介 web服务器需要与客户端之间发生大量的IO操作,这也是性能的瓶颈之一。在这个项目中,我们用IO多路复用技术中的epoll来尽可能地提高一下性能。 epoll区别于select和poll,不需要每次轮询整个描述符集合来查找哪个描述符对应的IO已经做好准备了,epoll采用事件驱动的方式,当有事件准备就绪后就会一次返回已经做好准备的所有描述符集合。 epoll提供的程序接口有: int epoll_create(int size); 在内核中创建epoll实例并返回一个epoll文件描述符。 在最…

2021年6月6日 0条评论 394点热度 0人点赞 agedcat_xuanzai 阅读全文

buffer缓冲区的介绍 在这个项目中,客户端连接发来的HTTP请求以及回复给客户端所请求的资源,都需要缓冲区的存在。其实,在操作系统的内核中就有缓冲区的实现,read()/write()的调用就离不开缓冲区的支持。但是,在这里用缓冲区的实现不太方便。所以,在这个项目中实现了一个符合需要的缓冲区结构。 在C++的STL库中,vector容器其实就很适合作为缓冲区。为了能够满足我们的需要,我们以vector容器作为底层实体,在它的上面封装自己所需要的方法来实现一个自己的buffer缓冲区,满足读写的需要。 buffe…

2021年6月6日 2条评论 550点热度 0人点赞 agedcat_xuanzai 阅读全文

静态库与动态库 由文章C++编译过程可知,C++源文件编译的过程要经过以下四个步骤: $$ 预处理 \rightarrow 编译 \rightarrow 汇编 \rightarrow 链接 $$ 其中在编译和链接的过程中,我们常常需要与静态库和动态库打交道。 在此之前,先了解一下ELF文件格式。 ELF文件格式 编译器编译源代码后生成的文件叫做目标文件,而目标文件经过编译器链接之后得到的就是可执行文件。那么目标文件到底是什么? 目前,PC平台流行的 可执行文件格式(Executable) 主要包含如下两种,它们都是…

2021年6月4日 0条评论 318点热度 1人点赞 agedcat_xuanzai 阅读全文

如何写 makefile 文件 什么是makefile? 在Linux环境下进行工程项目的开发,编译一般是通过make命令来完成。而make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。 makefile 的规则  target ... : prerequisites ...     command     ...     ... target 可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“…

2021年6月4日 0条评论 204点热度 2人点赞 agedcat_xuanzai 阅读全文
12