1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
goAhead分析

goAhead 源码解析 主循环. (1)bopen, 先malloc 一个固定大小的空间给webserver程序使用. #define balloc(B_ARGS, num) balloc(num) #define bfree(B_ARGS, p) bfree(p) #define bfreeSafe(B_ARGS, p) bfreeSafe(p) #define brealloc(B_ARGS, p, size) brealloc(p, size) #define bstrdup(B_ARGS, p) bstrdup(p) initWebs() 2.1 socketOpen() 2.1.1 socket 数据结构 关于socket的变量. 分配socket ( hAllocEntry原理 hAlloc分配一个list,一个指针数组,一个数组项代表一个可以分配的ID 指针数字的前两个单元,一个用来记录数组长度.一个用来记录已经使用数量. { U32_t length; U32_t used; Void *mp[16]; } 如果申请ID时,资源不够,可以利用malloc重新加长数组. 关于ringBuf 环形缓冲区. 2.2 OpenServer 2.2.1 symOpen () 2.2.2 webFormOpen() 2.2.3 webOpenListen() 注意函数 指定了accept函数指针为webAccept 1. 2 3,系统调用socket()分配socket号. 调用bind .listen,已经设定socket的block标志 注意设置了sp-flag | = SOCKET_LISTENING Sp-handleMask |= SOCKET_READABLE;缺省情况下goAhead设置socket为NON_BLOCK的 2.3.1websUrlHandlerDefine Handler的数据结构 对Url的处理函数会生产一个由webUrlHandler指向的一个表,websUrlHandlerMax表示当前有多少个handler.qsort调整handler调用的顺序.当收到Url请求时,通过比较urlPrefix确定调用表格里面哪一个Handler去处理.对于websSecurityHandler,websDefaultHandler所有的url都会处理. Request handler处理函数 主循环 3.1 socketReady socketReady函数检查已建立连接的socket中是否有以下事件,如果检查到一个,就返回1,如果没有检查到,就返回零。 (1)?????????? sp-flags SOCKET_CONNRESET,如果该socket的flag标志为SOCKET_CONNRESET(该标志在哪里设置(初始化)的?),则调用函数socketCloseConnection(该函数后面会解释)关闭该socket连接,然后返回0; (2)?????????? sp-currentEvents sp-handlerMask,如果该socket当前的事件和他要处理的事件相同,就返回1,告诉调用socketReady的函数有socket准备好被处理了; (3)?????????? sp-handlerMask SOCKET_READABLE socketInputBuffered(sid) 0,如果该socket要处理的事件是SOCKET_READABLE并且该socket的缓存中有可读的数据,则调用socketSelect函数(为什么在这里要调用这个函数,看了下socketSelect,应该是为了设置sp-currentEvents |= SOCKET_READABLE,所以这里应可以优化),然后返回1,告诉调用socketReady的函数有socket准备好被处理了; socketDoEvent(sp)中处理的 (4)?????????? socketReady函数根据传入的参数sid决定是检查id为sid的socket(当sid大于0),还是遍历整个socketList(当sid小于0),如果以上3个条件中没有一个满足,则返回0。 socketSelect函数 系统调用select的外包函数,该函数的主要功能就是监听(?)注册的socket事件集合,然后修改sp-currentEvents变量。 socketProcess(-1)函数分析 socketProcess处理到达的socket事件,如果传入的参数是小于0,则会处理所有的socket的事件,如果大于0,则会处理指定的socket的事件。下面是主

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档