基于C++实现的简易WEB服务器

C++实现的简易WEB服务器 1 项目描述: 一个基于c++实现的web服务器,可以对http请求进行解析响应,可以支持上万的QPS 2 项目环境: linux

本文包含相关资料包-----> 点击直达获取<-------

C++实现的简易WEB服务器

1 项目描述:

一个基于c++实现的web服务器,可以对http请求进行解析响应,可以支持上万的QPS

2 项目环境:

linux,c++14,MySql

3 项目要点:

  1. 实现了基于epoll和线程池的多线程Reactor高并发模型;

  2. 实现了基于小根堆实现的计时器,用来关闭超时的停止活动的客户端连接;

  3. 实现了基于单例和阻塞队列的异步日志系统,用来记录服务器的运行状态;

  4. 实现了基于RAII机制的数据库连接池,用来减少数据库连接建立和关闭的开销。

  5. 使用标准库容器封装char,用来实现缓冲区的自动增长;

  6. 使用正则表达式和状态机来解析HTTP请求消息,用来实现对静态资源的请求。

4 项目细节

4.1 工作逻辑

main函数中先初始化服务器WebServer对象server,调用 server.Start(); 函数启动服务器。

WebServer类中启动服务器的start函数如下:

函数循环调用epoll来监听连接事件,写事件和读事件,并对这些事件进行相应的处理,对于监听到的异常事件,服务器关闭相关的客户端连接。

c++ /* 启动服务器 */ void WebServer::Start() { int timeMS = -1; // epoll wait timeout == -1 无事件将阻塞 if(!isClose_) { LOG_INFO("========== Server start =========="); } // 循环调用epoll while(!isClose_) { // 解决超时连接 if(timeoutMS_ > 0) { timeMS = timer_->GetNextTick(); // 清除超时的客户端连接,并得到下一次超时的时间 } int eventCnt = epoller_->Wait(timeMS); // 使得epoller_wait阻塞超过timeMS时间返回 for(int i = 0; i < eventCnt; i++) { /* 处理事件 */ int fd = epoller_->GetEventFd(i); uint32_t events = epoller_->GetEvents(i); if(fd == listenFd_) { //处理监听事件 DealListen_(); } else if(events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR)) { //异常 assert(users_.count(fd) > 0); CloseConn_(&users_[fd]); } else if(events & EPOLLIN) { //处理读操作 assert(users_.count(fd) > 0); DealRead_(&users_[fd]); } else if(events & EPOLLOUT) { //处理写操作 assert(users_.count(fd) > 0); DealWrite_(&users_[fd]); } else { LOG_ERROR("Unexpected event"); } } } }

但监听到连接事件的时候,程序调用 DealListen_ 函数对连接进行处理,函数具体如下,程序调用accept函数建立与客户端的连接,在ET模式模式下我们需要一次性处理所有的连接。

```c++ / 处理连接事件 / void WebServer::DealListen_() { struct sockaddr_in addr; //保存连接的客户端的地址 socklen_t len = sizeof(addr); do { //非阻塞的accept int fd = accept(listenFd_, (struct sockaddr *)&addr, &len);

    if(fd <= 0) { return;}
    else if(HttpConn::userCount >= MAX_FD) {
        SendError_(fd, "Server busy!");
        LOG_WARN("Clients is full!");
        return;
    }

    AddClient_(fd, addr);            //添加客户端
} while(listenEvent_ & EPOLLET);     //ET模式:需要一次性处理全部的连接

} ```

AddClient_函数将每一个客户端连接都封装成为HttpConn类,并给这个客户端注册写事件,使得epoll可以监听到该客户端的请求(HttpConn类中的文件描述符的读事件)。

c++ void WebServer::AddClient_(int fd, sockaddr_in addr) { assert(fd > 0); users_[fd].init(fd, addr); if(timeoutMS_ > 0) { // 超时调用回调函数,关闭连接 timer_->add(fd, timeoutMS_, std::bind(&WebServer::CloseConn_, this, &users_[fd])); } // 给这个客户端注册写事件 epoller_->AddFd(fd, EPOLLIN | connEvent_); SetFdNonblock(fd); LOG_INFO("Client[%d] in!", users_[fd].GetFd()); }

但监听到读事件的时候,程序调用 DealRead_ 函数对读时间进行处理,传入的参数为epoll监听到写事件的文件描述符对应的HttpConn,函数具体如下,程序将读的工作(OnRead_工作函数)添加到线程池中的工作队列中,交给线程池中的线程去处理。

c++ /* 处理读事件 */ void WebServer::DealRead_(HttpConn* client) { assert(client); ExtentTime_(client); // 延长超时时间 //由线程池中的子线程来处理读操作 threadpool_->AddTask(std::bind(&WebServer::OnRead_, this, client)); }

OnRead_工作函数如下,程序调用对应客户端连接的read函数,将客户端连接的套接字中读数据到改客户端连接的对应的readBuff_中。

c++ /* 线程池中的子线程的读工作函数 */ void WebServer::OnRead_(HttpConn* client) { assert(client); int ret = -1; int readErrno = 0; ret = client->read(&readErrno); // 读取客户端套接字的数据,读到httpconn的读缓存区 if(ret <= 0 && readErrno != EAGAIN) { // 读异常就关闭客户端 CloseConn_(client); return; } // 业务逻辑的处理(先读后处理) OnProcess(client); }

c++ ssize_t HttpConn::read(int* saveErrno) { ssize_t len = -1; do { // 客户端的套接字中读数据到readBuff_中 len = readBuff_.ReadFd(fd_, saveErrno); if (len <= 0) { break; } } while (isET);//ET:要一次性全部读出 return len; }

当读事件完成以后,需要调用OnProcess函数对读到的数据进行处理(对读到的请求数据进行解析和响应)。

c++ /* 处理读(请求)数据的函数 */ void WebServer::OnProcess(HttpConn* client) { if(client->process()) { epoller_->ModFd(client->GetFd(), connEvent_ | EPOLLOUT);//相应成功,修改监听事件为写 } else { epoller_->ModFd(client->GetFd(), connEvent_ | EPOLLIN); } }

参考文献

  • 基于.NET架构的商业网站设计与实现(山东大学·张超)
  • 基于J2EE的远程教育平台的开发与实现(吉林大学·葛瑛)
  • 基于ASP.NET开发技术的BBS论坛研究与设计(中国海洋大学·马章勤)
  • 基于Qt的跨平台web服务开发框架(西安电子科技大学·张劲峰)
  • 基于.NET平台的XML Web Services研究与实现(兰州理工大学·杨静)
  • 中小型物流企业物流信息平台设计与实现(西安电子科技大学·孙瀚渝)
  • 基于JSP的雄霸天下游戏网的后台操作系统的开发设计(电子科技大学·张璇)
  • 利用.NET技术实现电子政务系统的研究(武汉理工大学·甘俊)
  • 基于Web服务的企业信息化集成应用(云南财经大学·韩雪)
  • 基于.NET下Web服务的信息查询系统的研究与设计(合肥工业大学·张静)
  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • 基于.NET架构的商业网站设计与实现(山东大学·张超)
  • 基于.NET架构的商业网站设计与实现(山东大学·张超)
  • 基于B/S架构的DCS现场控制站数据服务器设计(河北大学·张钊熙)
  • 基于WEB技术的新闻发布系统的设计与实现(电子科技大学·黄红)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码码头网 ,原文地址:https://m.bishedaima.com/yuanma/36074.html

相关推荐

  • 基于Python之枚举法的应用

    1, 课程设计目的 《软件设计基础-Python》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖Python的知识点,又接近工程实际需要
    2024年05月14日
    4 1 1
  • 基于Python客服脚本解释器的实现

    客服脚本解释器实现 一,脚本设计说明 1, 编码 默认情况下,以UTF-8编码进行解析脚本 也可以为源码文件指定不同的编码解析方式(类似于Python) 在脚本开头注明以下语句代表文件以GBK编码解析 ! using coding GBK 2
    2024年05月14日
    2 1 1
  • JSP+Sqlserver实现威客任务平台(源码+论文)

    这是一个🔥🔥JSP+Sqlserver实现威客任务平台🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 威客任务平台开发技术栈为JSP项目,可以作为毕业设计课程设计作业基于jsp+servlet+sqlserver实现一个威客众包任务平台
    2024年05月23日
    7 1 2
  • 基于Spring+SpringMVC+hibernate+MySQL实现的体检中心管理系统

    基于Spring+SpringMVC+hibernate+MySQL实现的体检中心管理系统 摘 要 随着人们生活水平的不断提高,人们的保健意识随之增强
    2024年05月14日
    1 1 1
  • 基于SSM的内容管理系统源码-免费下载

    这是一个🔥🔥基于SSM的内容管理系统源码-免费下载🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 内容管理系统开发技术栈为SSM项目,可以作为毕业设计课程设计作业使用SSM框架(Spring
    2024年05月23日
    1 1 1
  • 基于SpringBoot和MySQL的社区物业管理系统

    基于SpringBoot和MySQL的社区物业管理系统 1,项目简介 1,1 介绍 基于SpringBoot+Layui的社区物业管理系统 分为业主和管理员两个角色: 业主 车位费查询 物业费查询 我的投诉列表 我的报修列表等功能模块 管理员 车位收费管理 物业收费管理 投诉信息管理 报修信息管理 楼宇管理 房屋管理 业主管理 车位管理 抄表管理 用户管理 报表分析等功能 1
    2024年05月14日
    16 1 3
  • 基于Java的模拟写字板的设计与实现

    基于Java的模拟写字板的设计与实现 摘 要 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络,多线程等重要的基础知识
    2024年05月14日
    6 1 1
  • 基于ssm框架的在线医院挂号系统

    HospitalSystem 参考文献 医疗挂号系统服务端的设计与实现(北京邮电大学·郑朝杰) 基于MVC模式的医院预约挂号管理系统的设计与实现(广西大学·戴铭孚) 基于SSM的综合医养平台的设计与实现(吉林大学·宋恩旭) 网上预约挂号系统的设计与实现(华中科技大学·游国强) 基于Android平台的预约挂号系统的设计与实现(江西财经大学·赵震) 在线医疗管理系统的研究与实现(辽宁科技大学·薄翔) 基于J2EE架构的医疗信息服务平台的设计与实现(北京交通大学·张颖彬) 医疗挂号系统运营支撑平台的设计与实现(北京邮电大学·孟祥建) 基于Android平台的预约挂号系统的设计与实现(江西财经大学·赵震) 基于J2EE架构的医疗信息服务平台的设计与实现(北京交通大学·张颖彬) 基于
    2024年05月14日
    6 1 1
  • 基于SpringBoot框架的在线兼职网

    这是一套采用Java编程语言构建的🔥🔥SpringBoot为核心的在线兼职网站源代码🔥🔥,该项目运用了SpringBoot框架和Vue,js技术,开发工具为Idea或Eclipse
    2024年05月23日
    21 1 3
  • 基于javaweb的酒店预订管理系统

    酒店业作为服务行业的重要组成部分,在数字化时代面临着日益激烈的市场竞争,随着互联网技术的发展,基于JavaWeb的酒店预订管理系统成为提升酒店管理效率和服务质量的重要手段
    2024年05月07日
    3 1 1

发表回复

登录后才能评论