设置系统启动数 系统开始计时 设置并打开系统日志 设置文件系统限制 系统设置 初始化socketlist 设置server系统IP 网络通讯设置 创建系统会话 将系统会话加入监听 设置网页根目录 设置路由规则(绑定redirect和continue的处理函数) 设置cgi规则(绑定cgi的处理函数) 设置option规则(绑定option的处理函数) 设置action规则(绑定action的处理函数) 设置file规则(绑定file的处理函数) 设置upload规则(绑定upload的处理函数) 设置jst规则(绑定jst的处理函数) 设置验证规则(绑定Login,logout的处理函数) 相关操作调用设置 定义ME_ROM则设置相关文件路径 文件读取和认证设置 读取并设置路由和认证配置信息 GoAhead初始化流程图(websOpen函数)
处理流程:
initPlatform():啥都没干
websOpen()初始化服务器
websLoad()加载认证信息
websListen()监听请求
websServiceEvents()处理服务事件
websClose()关闭服务器
初始化服务器 websOpen() 加载应用 websLoad() 监听请求 websListen() 处理事件(发生/计划) websServiceEvents() 关闭服务器 websClose() GoAhead运行流程
退出处理:
websClose()关闭服务器
异常处理:
Logmsg()写日志 Return -1;退出
三、关键函数解析
第一层中(main函数)
websListen()监听函数分析
socketParseAddress();从语法上分析出IP,port并返回。 socketListen();设置socket并监听 socketPtr();返回正确的socket:从socketList[]中
设置访问服务器的url,ip,port(放入全局变量listens,等进行监听:select方式)
第二层中(socketListen)关键结构体:socketList –》WebsSocket-》socket socketAlloc();分配一个socket结构(及其相关操作)并记录(通过socketList[]) socketInfo();配置socket相关的信息 socket();socket基本函数,设置socket setsockopt();socket基本函数,设置socket可复用 bind();socket基本函数,绑定socket listen();socket基本函数,监听socket
后续处理
socketSetBlock();设置socket到块模式 socketSetNoDelay();设置socket非阻塞
第三层中:(socketAlloc) wallocObject();依据socketList[]分配一个socket id 将处理函数赋给对应的socketList[];
其参数中包含accept函数(websAccept): websAccept()处理新连接
websAlloc()分配一个初始化后的页面句柄,之后通过webs[]来保存 getsockname()获得socket地址(sockaddr)
socketAddress()获得本地IP地址(通过webs结构)。 确定是否是本地连接
websStartEvent()调用web计划任务(callbacks[]结构,当时间到来时候checkTimeout函数)。
socketEvent()处理web计划或者socket事件:读或写或停止(通过webs结构及其指向的事件)
第一层中
websServiceEvents函数 //循环:
socketSelect();监听读写事件,并将发生的事件保存入对应的socketList[]中。 socketProcess();处理刚发生的事件 websCgiPoll();处理cgi事件,通过cgiList[]; websRunEvents();运行计划事件任务,通过callbacks[]; min();设置delay时间 //
第二层中socketProcess
循环检查socketList []若有事件,则调用socketDoEvent();处理socket事件 第三层中socketDoEvent() socketAccept();处理新连接(callback[]回调发起的) 检查socket是否仍然有效
第四层socketAccept()
accept()socket基本函数,接收新连接。(WebsSocket结构传递socket) 加入到socketList[]中进行监听
设置为block阻塞模式,根据情况可设置为非阻塞模式。 socketAddress()获取用户地址 调用相应的websaccept();
第二层中websCgiPoll 循环检查cgiList[]
websCgiGatherOutput();处理对应的cgi(响应的函数和文件) checkCgi();检测cgi进程是否还存在 存在则继续调用websCgiGatherOutput();处理
第二层中websRunEvents
callEvent()按照时间到来的顺序,依次检查调用此函数。 第三层callEvent()
调用callbacks[]中对应的注册函数。
四、处理流程分析
GoAhead服务器File HandlerRequestAction HandlerJavaScript HandlerCGI HandlerFrom data浏览器HTTPCoreLoginSession StateRouterAuthentication FrameworkSSLPortable Runtime GoAhead组件协同处理请求
/HTTP_Core/Request Router/Session State/Action Handler/File Handler/JavaScript Handler/CGI Handler/ : Browser1 : request()2 : socketEvent()3 : websRunRequest()4 : websGetSession()5 : websActionOpen()6 : websFileOpen()7 : websResponse()8 : websJstOpen()10 : websCgiOpen()9 : jsEval()12 : websDone()11 : launchCgi()13 : websCgiPoll()14 : response()
Request处理流程图
相关推荐: