基于Linux的C++轻量级web服务器/webserver/httpserver——webserver类详解
webserver介绍
这个webserver类是对整个web服务器的抽象。在这个类中,调用之前编写的四大模块:Httpconnection类、Epoller类、Timer类以及ThreadPool类完成整个服务器项目的功能。
webserver的逻辑
第一步是服务器的初始化。在webserver的构造函数中完成对Httpconnection类、Epoller类、Timer类以及ThreadPool类对象的初始化,同时还需要设置好服务器的socket,暴露端口等相关信息
m_port = port;initEventMode(trigMode);m_timeoutMs = timeoutMS;m_openLinger = optLinger;m_pool = std::make_unique<Threadpool>(threadNum);m_timer = std::make_unique<TimeManager>();m_epoller = std::make_unique<Epoller>();m_isclose = (initSocket() ? false : true);
本项目是使用I/O多路复用技术中的epoll,在初始化socket的过程中,将m_listenFd加入中epoll池中。同时,也将监听socket的行为(是否有新的连接)和监听每一个HTTP连接的行为(已经建立的连接有无IO请求)统一起来了。在每一次直接处理所有的epoll就绪事件时,通过就绪事件的fd可以区分开新连接和I/O请求,并对两种不同的情况分别处理。
第二步是开始处理HTTP连接。
一开始要先清理过期的连接,并且得到下一次处理的时间。这里使用Timer指针调用Timer类对象的getNextHandle()
函数:
timeMs = m_timer->getNextHandle();
将得到的时间传递给epoll_wait函数作为时间参数,经过相应的时间等待后,得到发生改变的事件,用一个循环处理所有的epoll就绪事件。在过程中需要分两种类型:收到新的HTTP请求和其他的读写请求。
- 收到新的HTTP请求的情况
在fd==m_listenFd的时候,也就是收到新的HTTP请求的时候,需要调用函数
void handleListen();
- 已经建立连接的HTTP发来IO请求的情况
这种情况下,必然需要提供读写的处理,用下述两个函数完成:
void handleWrite(Httpconnection *client);void handleRead(Httpconnection *client);
为了提高性能,使用了线程池,所以这两个函数就是将读写的底层实现函数加入到线程池,两个读写的底层实现函数为:
void onRead(HTTPconnection* client);void onWrite(HTTPconnection* client);
听到这里大家也许有点懵?这个读和写的过程在webServer类中,是这样的:
读:
调用handleWrite–>将onRead函数扔给线程池去执行
而onRead函数是调用Httpconnection对象的读取函数,而Httpconnection的读取函数实际上是Buffer类对象的读取函数的封装
简而言之,在handleRead函数中,就是让线程池去执行Buffer对象中读取函数,获取通信的内容。在onRead函数中读取完成后,再调用Httpconnection的处理函数,将读取完的数据进行一个相应的处理,具体的处理过程可以查看我之前写的http的文档写:
调用handleWrite–>将onWrite函数扔给线程池去执行
同onRead函数一样,在onWrite函数中,其核心函数是Buffer对象中的发送函数。在onWrite函数中,如果发送数据有错误产生的话,会根据错误号和发送数据的返回值,判断数据发送出现哪种问题:- 某些原因导致发送字节数 == 0:重新处理接收到数据,等待下一次的发送?
- 返回值-1,进一步根据系统错误号判断:
- 错误号为EAGAIN:重置为写状态,下一次epoll检测后,再次发送
- 其他错误:直接关闭通信
epoll使用的是边缘触发ET,此外在读结束的时候根据需要改变epoll的事件。
基于Linux的C++轻量级web服务器/webserver/httpserver——webserver类详解相关推荐
- 基于Linux的C++轻量级web服务器/webserver/httpserver
WebServer详解 使用C++语言,编写了一个基于Linux的HttpServer,能够实现上万的QPS. 项目地址: gitee仓库 github仓库 功能 利用I/O多路复用技术的Epoll与 ...
- 基于Linux的C++轻量级web服务器/webserver/httpserver——线程池
1. 背景 什么是线程池? 线程池技术是池化技术的一种.除了线程池,还是内存池.连接池等其他池化技术.打个比方来说,线程池是将若干个随时可以执行任务的线程放在"池子"这种容器中,当 ...
- 基于Linux的C++轻量级web服务器/webserver/httpserver——MySQL数据库的使用
MySQL数据库的使用 常见的服务器设计,其结构组成一般都是:I/O处理模块.业务逻辑模块.数据模块. 我的另一个项目:chatserver聊天服务器其设计模式也是这样:使用Muduo处理网络I/O, ...
- Linux项目实战C++轻量级Web服务器源码分析TinyWebServer
目录 文章简介 一. 先跑起来项目 二.再看项目核心 三.逐个击破!立下flag 文章简介 TinyWebServer是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的 ...
- linux环境下企业基于域名访问的web于电子邮件服务器 论文,基于Linux平台的企业邮件服务器搭建...
我失骄杨君失柳,杨柳轻飏直上重霄九.得道多助,失道寡助.身后有余忘缩手,眼前无路想回头.鸟宿池边树,僧敲月下门.想当年,金戈铁马,气吞万里如虎. 本文由418133804贡献 pdf文档可能在WAP端 ...
- 首个Nginx windows Stable 版--轻量级Web服务器Nginx 0.7.59
2009.05.25 日晚,Igor Sysoev放出最近被广泛使用的轻量级Web服务器Nginx 0.7系列最新版本0.7.59,同时正式将0.7做为新的Stable稳定系列(0.7.0由19 Ma ...
- 轻量级WEB服务器Nginx介绍
轻量级WEB服务器Nginx介绍 本文目录 第1 章 Nginx 简介 ................................................................ ...
- 基于epoll实现简单的web服务器
1. 简介 epoll 是 Linux 平台下特有的一种 I/O 复用模型实现,于 2002 年在 Linux kernel 2.5.44 中被引入.在 epoll 之前,Unix/Linux 平台下 ...
- Linux C简单的web服务器
Linux C简单的web服务器 目录 Linux C简单的web服务器 一.基础类型重命名 二.包裹函数(wrap.h/wrap.c 主要是网络通讯和多线程的包裹函数) 三.服务端程序(web_se ...
最新文章
- ant自动打包多个android项目为apk
- cocos2d-x打包后手机运行闪退_三国志11手机版,问题解决手册 1.4.4版本
- 鸿蒙系统用没有安卓的代码,套壳?不存在!纯鸿蒙系统不含任何安卓代码,其他手机厂商可使用...
- AT2371-[AGC013E]Placing Squares【矩阵乘法】
- linux-----强大的find
- 唯一索引与主键索引的比较
- 未来的计算机作文100,未来的自己作文100字
- [ Ubuntu Chinese Method ] uninstall DBus, install fcitx
- mysql列不与第一行的值匹配_MySQL和PHP错误:列数与第1行的值数不匹配
- 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
- 个人博客作业-Week2 (代码规范, 代码复审)
- 无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?
- 手工清除U盘里的恶意病毒
- 数字图像处理,图像配准SIFT算法 (Lowe的代码)
- CTR广告点击率预估
- Canvas画环形圆
- 剪刀石头布(自留底)01
- 已有域名,如何建站。
- GetLasError参数详解
- 普元软件推动企业应用架构转型互联网