# httpserver_cpp_reactor **Repository Path**: johbenny/httpserver_cpp_reactor ## Basic Information - **Project Name**: httpserver_cpp_reactor - **Description**: 使用C++编写Reactor模型,实现支持高并发的http服务器,支持get请求。 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2023-02-27 - **Last Updated**: 2024-02-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # httpserver_cpp_reactor ## 介绍 使用C++编写Reactor模型(主从Reactor),实现支持高并发的http服务器,支持get请求 ## 环境 - visual studion 2019 community - WSL(windows 11) - Ubuntu-18.04 >使用visual studio 2019 远程连接Linux编译环境,WSL使用详见 **[微软官方文档](https://learn.microsoft.com/zh-cn/windows/wsl/)** ## ab压力测试 - 使用本地wsl部署测试 ![wsl_根目录](vx_images/70615609230269.png) - 部署在阿里云ecs服务器测试 ![](vx_images/473542710248695.png) >丐版ecs服务器(1vCPU,2GiB,1Mbps),测试没有实际意义 ## 结构介绍 **主Reactor**只检测一个Socket套接字,用于建立连接,将连接建立完成后产生的通信文件描述符传给**从Reactor**,由从Reactor检测通信文件描述符的事件,并处理。 实际用于处理检测的主从Reactor的eventloop模型结构都是相同的。主Reacotr对事件的处理是分发给从Reactor,而从Reactor对事件的处理是完成通信操作。(通过传入不同的回调函数,来实现不同的响应) 1. 主线程将Socket套接字放进eventloop中检测连接事件(有请求,可读),检测成功后调用TcpServer::acceptConnection将连接传递给线程池中某一子线程,子线程将其加入任务队列中,放入其eventloop中检测,有事件就绪就自行处理。 2. 线程池启动时,完成子线程及子线程对应的eventloop的创建,而后启动子线程(子线程内部启动eventloop)。 eventloop->run()函数内(死)循环处理【任务检测及派发,更新任务队列】工作。`正常工作时是死循环` 3. channel 封装监听的文件描述符及相关的操作(3个回调函数:处理读事件,处理写事件,处理连接断开[销毁]). 4. EpollDispatcher实现Dispatcher接口,内部成员函数封装关于epoll的所有操作. 实际上代码中分别实现了select,poll和select的封装,根据需求更改Dispatcher引用的子类对象 5. Buffer类封装一个自定义缓存,用于读写操作时缓存数据,内部实现缓存数据和自动扩容操作。(解析Http请求和响应Http请求时使用,即给应用层提供服务) 6. HttpRequest类完成对http请求的解析,获取请求头、请求行。定义发送文件夹(目录)和发送文件的方法,根据请求文件类型,将对应发送方法传给 httpResponse类。(回调函数传参) 7. HttpResponse类组织http响应,使用httpReques类的发送方法,发送文件。 8. TcpConnection类管理一个通信文件描述符,处理文件描述符对应的读写操作请求(调用httpRequest和httpResponse来处理)