- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)