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请求和其他的读写请求。

  1. 收到新的HTTP请求的情况

在fd==m_listenFd的时候,也就是收到新的HTTP请求的时候,需要调用函数

    void handleListen();
  1. 已经建立连接的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类详解相关推荐

  1. 基于Linux的C++轻量级web服务器/webserver/httpserver

    WebServer详解 使用C++语言,编写了一个基于Linux的HttpServer,能够实现上万的QPS. 项目地址: gitee仓库 github仓库 功能 利用I/O多路复用技术的Epoll与 ...

  2. 基于Linux的C++轻量级web服务器/webserver/httpserver——线程池

    1. 背景 什么是线程池? 线程池技术是池化技术的一种.除了线程池,还是内存池.连接池等其他池化技术.打个比方来说,线程池是将若干个随时可以执行任务的线程放在"池子"这种容器中,当 ...

  3. 基于Linux的C++轻量级web服务器/webserver/httpserver——MySQL数据库的使用

    MySQL数据库的使用 常见的服务器设计,其结构组成一般都是:I/O处理模块.业务逻辑模块.数据模块. 我的另一个项目:chatserver聊天服务器其设计模式也是这样:使用Muduo处理网络I/O, ...

  4. Linux项目实战C++轻量级Web服务器源码分析TinyWebServer

    目录 文章简介 一. 先跑起来项目 二.再看项目核心 三.逐个击破!立下flag 文章简介 TinyWebServer是Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的 ...

  5. linux环境下企业基于域名访问的web于电子邮件服务器 论文,基于Linux平台的企业邮件服务器搭建...

    我失骄杨君失柳,杨柳轻飏直上重霄九.得道多助,失道寡助.身后有余忘缩手,眼前无路想回头.鸟宿池边树,僧敲月下门.想当年,金戈铁马,气吞万里如虎. 本文由418133804贡献 pdf文档可能在WAP端 ...

  6. 首个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 ...

  7. 轻量级WEB服务器Nginx介绍

    轻量级WEB服务器Nginx介绍 本文目录 第1 章 Nginx 简介 ................................................................ ...

  8. 基于epoll实现简单的web服务器

    1. 简介 epoll 是 Linux 平台下特有的一种 I/O 复用模型实现,于 2002 年在 Linux kernel 2.5.44 中被引入.在 epoll 之前,Unix/Linux 平台下 ...

  9. Linux C简单的web服务器

    Linux C简单的web服务器 目录 Linux C简单的web服务器 一.基础类型重命名 二.包裹函数(wrap.h/wrap.c 主要是网络通讯和多线程的包裹函数) 三.服务端程序(web_se ...

最新文章

  1. ant自动打包多个android项目为apk
  2. cocos2d-x打包后手机运行闪退_三国志11手机版,问题解决手册 1.4.4版本
  3. 鸿蒙系统用没有安卓的代码,套壳?不存在!纯鸿蒙系统不含任何安卓代码,其他手机厂商可使用...
  4. AT2371-[AGC013E]Placing Squares【矩阵乘法】
  5. linux-----强大的find
  6. 唯一索引与主键索引的比较
  7. 未来的计算机作文100,未来的自己作文100字
  8. [ Ubuntu Chinese Method ] uninstall DBus, install fcitx
  9. mysql列不与第一行的值匹配_MySQL和PHP错误:列数与第1行的值数不匹配
  10. 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
  11. 个人博客作业-Week2 (代码规范, 代码复审)
  12. 无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?
  13. 手工清除U盘里的恶意病毒
  14. 数字图像处理,图像配准SIFT算法 (Lowe的代码)
  15. CTR广告点击率预估
  16. Canvas画环形圆
  17. 剪刀石头布(自留底)01
  18. 已有域名,如何建站。
  19. GetLasError参数详解
  20. 普元软件推动企业应用架构转型互联网

热门文章

  1. 雷军:程序员的头顶上都是一栋别墅,保护好头发很重要
  2. junit编写测试代码_编写数据访问代码测试–绿色建筑不够好
  3. 怎么有效克服演讲的紧张感?
  4. QQ炫舞官网选项卡效果
  5. 图片马的制作以及菜刀的使用
  6. HDL—Verilog Language—Vectors—Vector reversal 1
  7. android message的作用,Android消息机制之Message解析(面试)
  8. conda 配置虚拟环境
  9. tail命令的常见用法
  10. 管理者必须卓有成效(卓有成效的管理者)