webserver流程图
2022-06-26 15:48:42 3 举报
详细流程图看清webserver各个模块的调用关系,搞懂webserver
作者其他创作
大纲/内容
关闭事件到达:关闭连接
main函数内调用
通过信号量通知工作线程读取任务
Buffer::ReadFd
DealListen内部调用AddClient_
CloseConn内部调用
将监听套接字添加到epoll事件
HttpRequest::parse:解析请求体
获得并设置目录路径
关闭客户端
构造函数初始化列表:定时器,线程池,Epoll
更新状态为BODY
yes
执行epoller_->ModFd
初始化并连接指定个数个数据库
设置边缘触发
设置定时时间:ExtentTime
返回到Webserver::OnWrite
no
http客户端的初始化
AddClient内部调用HttpConn的init函数
path == \"/\"?
Reactor模式监听事件 while(!isClose){ }
1 正则表达式匹配2 改变状态(有限状态机)
DealWrite内部调用
设置套接字选项字段
给以上格式添加“.html”后缀
给WebServer添加一个客户端:AddClient_
设置套接字非阻塞
任务队列为空就挂起,否则就取出任务执行任务(执行的任务只有读写)
获取就绪事件
调用HttpRequest::ParsePost
调用HttpRequest::ParseRequestLine
创建指定个数的线程
调用HttpConn的write
监听
线程池添加任务:AddTask(添加的是写任务:绑定OnWrite)
yes&&客户端存活
初始化监听事件模式
OnRead内部调用HttpConn::read
Httpconn::process调用
调用
HttpConn::write内部调用
写
响应文件
任务队列有任务?
取出任务
绑定
webserver类构造函数
Http::Init:初始化请求体
读、写任务?
调用Httpconn::process
核实用户(校验用户名和密码)
调用失败
添加响应头
监听事件到达:建立连接
new
调用HttpRequest::ParseBody
BODY
读事件到达
结束
创建epfd
获取一行数据
写事件到达
自增长缓冲区读数据
调用HttpRequest::ParsePath_
数据读取完成,调用OnProcess进行处理读取的数据
挂起
初始化响应体:200
获取就绪事件的fd
初始化网络套接字
Webserver::OnProcess
Httpconn::process调用HttpResponse::MakeResponse
HttpConn::read内部调用ReadFd
传输完成?
创建的每一个线程在lamada函数中执行
读任务处理完毕
main函数
添加响应行
Epoller
返回HttpRequest::parse函数
HttpConn::read
继续监听读事件
解析请求体
调用OnProcess处理
调用epoller->ModFd续传
因为connEvent设置了EPOLLONESHOT,故在一次事件处理完成后必须调用epoll_ctl的EPOLL_CTL_MOD来重新设置fd,否则该fd将不会被处理;将事件设置成EPOLLONESHOT的目的是为了让一个事件只在一个线程中处理,避免资源浪费,合理利用线程资源。
构造函数内
请求体解析成功?
初始化日志
正则表达式匹配成功?
返回到HttpRequest::parse
设置epoll_wait超时时间
创建套接字
POST请求且Content-Type字段的值和条件里的值相同?
REQUEST_LINE
添加响应体
首先调用writev函数进行写入数据
设置请求头
线程池添加任务:AddTask(添加的是读任务:绑定OnRead)
OnRead内部调用
ThreadPool
HEADERS
Buffer::ReadableBytes
初始化SQL连接池:SqlConnPool::Instance()->Init
处理任务时调用的是void WebServer::OnWrite_
调用HttpRequest::ParseFromUrlencoded方法
处理任务时调用的是void WebServer::OnRead_
检查错误页面
DealListen内部调用
将监听的事件改为写事件:表明可写
OnWrite内部调用
建立连接:accept
server.Start
解析请求头
初始化响应体:400
HeapTimer
调用HttpConn的read
DealRead内部调用
读任务?
不期待的时间:输出错误
删除监听fd:DelFd
return;
解析请求行结束:接着解析请求头
解析网页路径:默认为index.html
epoll死循环监听事件
读
分发任务
返回OnRead内部调用OnProcess处理数据
生成响应体
执行完毕返回OnProcess
解析请求行
通过信号量通知工作线程取任务
处理写任务
switch
收藏
0 条评论
下一页