关于tinywebserever的工作流程

笔者c++纯菜鸡。tinyWebServer作为经典项目,不得不品尝。大佬的项目详解虽然已经很详细了,但讲解的代码蓝本多为旧版本的。为了先理顺思路,笔者先稍微记录下对代码执行过程的个人理解。先附上项目给出的总览图

 

 

先看下各文件夹下的代码的作用:

  1. CGImysql 为sql创建了连接池来减少反复打开关闭连接带来的开销。操作只有创建线程池,获取连接,释放连接和销毁连接几个简单操作
  2. http 这位更是重量级的>-> 类似tinyhttp的结构,负责处理http请求的函数都在这里。函数很多,但主要可以分为三类:读http,写http和处理http事务
  3. lock 封装了用于同步的互斥锁,条件变量和信号量。没啥好说的。
  4. log 日志系统,阻塞队列实现异步写入
  5. threadpool 经典的线程池,减少开销。项目中使用了半同步/半反应堆模型。新的代码还支持了proactor模式
  6. timer 提供操作定时器的接口,用于关闭长时间不使用的连接。周期触发,升序链表实现
  7. webserver.h 初始化epoll,循环处理各事件

 先进main()中看一看:

复制代码
    server.init(config.PORT, user, passwd, databasename, config.LOGWrite, 
                config.OPT_LINGER, config.TRIGMode,  config.sql_num,  config.thread_num, 
                config.close_log, config.actor_model);
    

    //日志
    server.log_write();

    //数据库
    server.sql_pool();

    //线程池
    server.thread_pool();

    //触发模式
    server.trig_mode();

    //监听
    server.eventListen();

    //运行
    server.eventLoop();
复制代码

运行流程:

前面都是初始化各模块没啥好说的

 

Server.listen():设置socket,bind,listen流程走一遍。然后把socket注册到epoll,在对定时器进行下处理

 

server.eventLoop():这个才是重点,在webserver.h中实现。epoll_wait等待io事件发生。三种情况:新连接到来,连接关闭,处理信号(超时,服务器关闭),读,写。

  • 新事件到来:accept一个新的连接,然后再timer上注册一下就行。m_LISTENTrigmode用来表示是否一次处理完所有listen的连接请求。然后继续while(!stop_server).accept是默认阻塞的,没有新连接就停。这里不太懂,要是阻塞的话不久挂起了吗。
  • 连接关闭:移除定时器就好, 然后继续while(!stop_server).
  • 处理信号:超时就超时处理,关机就关机处理没啥好说的,然后继续while(!stop_server).
  • 读:个人理解的话,reactor和proacter模式区别在于读过程是否由主线程完成(reactor直接将sockfd挂到任务队列中,proactror调用read_once把数据读完后再将sockfd挂到队列)。总之,http_conn类对象users+sockfd被传入了任务队列。之后就没主线程什么事了
  • 写:proactor模式下不用再将任务加入任务队列里,写完就完事了

 

工作线程:

线程池中的空闲线程会通过信号量被唤醒,从work()到run(),然后在sql连接池中取出连接就可以执行process()了

 

Process():

主要流程就是读http报文(process_read)->处理http报文中的事件(do_reaquest)->写http报文(process_write)。报文的读写都是由主从状态机完成,do_resquest过程设计登录校验等流程。要注意的是读写的过程可能不是一次性能完成的,如果该任务没有被完成就要重新注册事件(同时千万别忘了修改epolloneshot的状态)。在完成写事件后要判断是否是长连接,如果不是长连接就关闭连接,如果是就得注册读事件。

做完这些后一次http的收发就结束了,当然其中过程包含着写日志,错误处理,加锁等操作,以后在慢慢写吧。

posted @   颉颃胜负!  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示