关于tinywebserever的工作流程
笔者c++纯菜鸡。tinyWebServer作为经典项目,不得不品尝。大佬的项目详解虽然已经很详细了,但讲解的代码蓝本多为旧版本的。为了先理顺思路,笔者先稍微记录下对代码执行过程的个人理解。先附上项目给出的总览图
先看下各文件夹下的代码的作用:
- CGImysql 为sql创建了连接池来减少反复打开关闭连接带来的开销。操作只有创建线程池,获取连接,释放连接和销毁连接几个简单操作
- http 这位更是重量级的>-> 类似tinyhttp的结构,负责处理http请求的函数都在这里。函数很多,但主要可以分为三类:读http,写http和处理http事务
- lock 封装了用于同步的互斥锁,条件变量和信号量。没啥好说的。
- log 日志系统,阻塞队列实现异步写入
- threadpool 经典的线程池,减少开销。项目中使用了半同步/半反应堆模型。新的代码还支持了proactor模式
- timer 提供操作定时器的接口,用于关闭长时间不使用的连接。周期触发,升序链表实现
- 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的收发就结束了,当然其中过程包含着写日志,错误处理,加锁等操作,以后在慢慢写吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)