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

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

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

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

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

2021年6月6日 0条评论 207点热度 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条评论 314点热度 0人点赞 agedcat_xuanzai 阅读全文

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

2021年6月6日 0条评论 332点热度 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条评论 284点热度 0人点赞 agedcat_xuanzai 阅读全文

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

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

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

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

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

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

这两天在写一个C++的小项目,得自己手写编译过程。正好总结一下网上的资料,留作以后查用。 编译流程 总体来说,编译的过程比较复杂,一般可以分为以下几个方面: 预处理(Preprocessing) 在实际编译工作开始之前,预处理器指令指示编译器对源码进行临时扩充,以为之后的步骤做好准备。 在 C++ 中,预处理器指令以 # 号开头,比如 #include、#define 和 #if 等。在这一阶段,编译器逐个处理 C++ 源码文件。对于 #define 指令,编译器将源码中的宏替换成宏定义中的内容;对于 #if、#i…

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