您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > goAhead343源码分析
goAhead3.4.3源码分析2014-12-22一、架构分析1、goAhead的作用一款开源的嵌入式web服务器系统。2、goAhead的特点goAhead则是专门针对嵌入式实时操作系统(RTOS)的webserver。他支持:SOAP客户端:简单对象访问协议。XML-RPC客户端:Flash客户端:性能指标:内存小:不包含ssl为60k,包含为500k响应速度:24MHZ下可有:20次/秒的响应速度266MHZ可有:50次/秒的响应。支持技术:ASP,嵌入式JSP,CGI,CGI处理GoFroms,扩展API,web页面可存在rom中。支持多种操作系统:vxWorks,linux,WinCE等。来源《基于VxWorks的WebServer研究和实现》3、GoAhead工作原理GoAheadweb服务器总体结构浏览器goAheadweb服务器HTMLJavaScript嵌入式系统应用GoAheadWeb服务器体系结构CGI工作原理4、GoAhead涉及的角色(关键组件)猜想:浏览器:应用:处理器:接收、发送、监听、转发器转发器:拦截(get,post,forward)、分析、转发(转发规则)安全日志记录主机日志处理器(操作函数)官网(关键组件):1、GoAheadHTTPCore:GoAheadHTTP核心,包括HTTP协议处理,socket连接管理和其日志记录。2、RequestRouter:请求路由,将用户的相关请求转发给相应的请求句柄。浏览器嵌入式设备GoAheadweb服务器CGI程序客户端发出请求激活CGI程序服务器返回结果返回处理结果浏览器GoAheadweb服务器HTML解析器Script解析器From生成器HTTP引擎顶层通讯TCP/IP协议底层通讯TCP/IP协议HTTP引擎HTML生成器浏览页面From解析器处理器3、PortableRuntime:轻便运行层。跨平台,单线程,非阻塞,事件驱动的轻量级运行层。主要负责:内存分配,安全字符句柄,链表,哈希,命令执行,socket通讯,事件,计时器,调试追踪,日志。4、AuthenticationFramework:认证框架。可拔插的认证,支持基本的,联通,网页基本表格的认证。5、SessionState:会话状态。会话状态存储。每个用户的状态和cookie的管理。6、ActionHandler:动作句柄。动作句柄绑定URI到c处理函数。7、FileHandler:文件句柄。服务于静态的文件:HTML,图片,pdf。8、JavaScriptHandler:js句柄。嵌入式服务器js。9、CGIHandler:cgi句柄。cgi程序。10、SecureSocketsLayer(SSL):ssl层。5、需要完成的操作1、设置socket2、监听端口3、接收、发送数据4、web处理初始化5、解析url6、转发请求:调用相应的应用7、二、功能分析初始化:initPlatform():啥都没干websOpen()初始化服务器初始化步骤(websOpen函数解析):websOsOpen();生成一个系统启动的随机数(标识系统)。websRuntimeOpen();开始系统计时;logOpen();打开日志;setFileLimits();设置文件系统限制socketOpen();初始化socketList为NULL;setLocalHost();将本机IP设置入server系统;hashCreate();创建一个webshashsessionwebsStartEvent();将webshashsession其加入callbacks[]列表中websSetDocuments();设置Document:根目录(全局变量)//以下类似于struct.xmlwebsOpenRoute();设置路由规则(redirect和continue绑定的函数和相应的跳转规则:根据服务器状态码)websCgiOpen();设置cgi的处理函数websOptionsOpen();设置option处理函数websActionOpen();设置action处理函数websFileOpen();设置file处理函数websUploadOpen();设置upload操作处理函数websJstOpen();设置jst和jstwrite处理函数websOpenAuth();设置验证规则。Login,logout验证函数和相关规则。//绑定函数设置结束websFsOpen();定义ME_ROM则设置相关文件路径websLoad();读取并设置路由和认证配置信息初始化流程图:GoAhead初始化流程图(websOpen函数)系统设置网络通讯设置相关操作调用设置文件读取和认证设置系统开始计时设置系统启动数设置并打开系统日志设置文件系统限制初始化socketlist设置server系统IP创建系统会话将系统会话加入监听设置网页根目录设置路由规则(绑定redirect和continue的处理函数)设置cgi规则(绑定cgi的处理函数)设置option规则(绑定option的处理函数)设置action规则(绑定action的处理函数)设置file规则(绑定file的处理函数)设置upload规则(绑定upload的处理函数)设置jst规则(绑定jst的处理函数)设置验证规则(绑定Login,logout的处理函数)定义ME_ROM则设置相关文件路径读取并设置路由和认证配置信息处理流程:initPlatform():啥都没干websOpen()初始化服务器websLoad()加载认证信息websListen()监听请求websServiceEvents()处理服务事件websClose()关闭服务器GoAhead运行流程退出处理:初始化服务器websOpen()加载应用websLoad()监听请求websListen()处理事件(发生/计划)websServiceEvents()关闭服务器websClose()websClose()关闭服务器异常处理:Logmsg()写日志Return-1;退出三、关键函数解析第一层中(main函数)websListen()监听函数分析socketParseAddress();从语法上分析出IP,port并返回。socketListen();设置socket并监听socketPtr();返回正确的socket:从socketList[]中设置访问服务器的url,ip,port(放入全局变量listens,等进行监听:select方式)第二层中(socketListen)关键结构体:socketList–》WebsSocket-》socketsocketAlloc();分配一个socket结构(及其相关操作)并记录(通过socketList[])socketInfo();配置socket相关的信息socket();socket基本函数,设置socketsetsockopt();socket基本函数,设置socket可复用bind();socket基本函数,绑定socketlisten();socket基本函数,监听socket后续处理socketSetBlock();设置socket到块模式socketSetNoDelay();设置socket非阻塞第三层中:(socketAlloc)wallocObject();依据socketList[]分配一个socketid将处理函数赋给对应的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();处理第二层中websRunEventscallEvent()按照时间到来的顺序,依次检查调用此函数。第三层callEvent()调用callbacks[]中对应的注册函数。四、处理流程分析浏览器GoAhead服务器HTTPCoreRequestRouterPortableRuntimeAuthenticationFrameworkSessionStateActionHandlerFileHandlerJavaScriptHandlerCGIHandlerSSLLoginFromdataGoAhead组件协同处理请求/HTTP_Core/:Browser/RequestRouter/SessionState/ActionHandler/FileHandler/JavaScriptHandler/CGIHandler1:request()2:socketEvent()3:websRunRequest()4:websGetSession()5:websActionOpen()6:websFileOpen()7:websResponse()8:websJstOpen()9:jsEval()10:websCgiOpen()11:launchCgi()12:websDone()13:websCgiPoll()14:response()Request处理流程图
本文标题:goAhead343源码分析
链接地址:https://www.777doc.com/doc-2874390 .html