goahead 流程
原文:https://blog.csdn.net/qq_32419007/article/details/80756643
1.全局变量
Web服务器的根目录
static char_t *rootWeb= T("/etc_ro/web");
端口号
static int port= 80;
尝试次数
static int retries= 5;
2.initWebs()
1.用到的全局变量的初始化,打开sym hash table、打开用户管理,注册UM tables
2.设置UM信息
3.设置网页的根目录
sprintf(webdir, "%s", rootWeb);
websSetDefaultDir(webdir)
4.设置默认访问页
websSetDefaultPage(T("default.asp"));
5.Web服务器端口和重试次数
websOpenServer(port, retries);
6.定义安全性处理程序,表单处理程序,默认网页处理程序
websUrlHandlerDefine(T(""), NULL, 0, websSecurityHandler,
WEBS_HANDLER_FIRST);
websUrlHandlerDefine(T("/goform"), NULL, 0,websFormHandler, 0);
websUrlHandlerDefine(T("/cgi-bin"), NULL, 0,websCgiHandler, 0);
websUrlHandlerDefine(T(""), NULL, 0,websDefaultHandler,
WEBS_HANDLER_LAST);
7.定义自己的功能
formDefineDvbs();
formDefineUtilities();
formDefineInternet();
#if definedCONFIG_RALINKAPP_SWQOS
formDefineQoS();
#endif
#if definedCONFIG_RALINKAPP_HWQOS
formDefineQoS();
#endif
#if (definedCONFIG_USB) || (defined CONFIG_MMC)
formDefineUSB();
#endif
#if definedCONFIG_RALINKAPP_MPLAYER
formDefineMedia();
#endif
formDefineWireless();
#if defined(RTDEV_SUPPORT)
formDefineInic();
#elif defined(CONFIG_RT2561_AP) || defined (CONFIG_RT2561_AP_MODULE)
formDefineLegacy();
#endif
#if definedCONFIG_RT2860V2_STA || defined CONFIG_RT2860V2_STA_MODULE || \
defined (CONFIG_RLT_STA_SUPPORT)
formDefineStation();
#endif
formDefineFirewall();
formDefineManagement();
8.为默认主页创建一个处理程序
websUrlHandlerDefine(T("/"), NULL, 0,websHomePageHandler, 0);
3. websSecurityHandler()
1. (flags& WEBS_LOCAL_REQUEST) && (debugSecurity == 0) 可以访问
2. am ==AM_NONE 输出404,page not found
3. 用户名不存在 输出401(身份验证)
判断用户是否能访问该路径,不能则输出403(服务器拒绝)
获取用户密码,不匹配则输出401
获取摘要认证字符串,不匹配则输出401
4.认证方法不为AM_FULL,输出401
4.socketReady()
socketReady函数检查已建立连接的socket中是否有以下事件,如果检查到其中一个,返回1,否则返回0
1.根据传入的sid遍历socketList(sid<0)
2.sp->flags & SOCKET_CONNRESET
该socket的flag标志为SOCKET_CONNRESET(uemf.h),则调用函数socketCloseConnection关闭socket连接,然后返回0
3.sp->currentEvents & sp->handlerMask
如果该socket当前事件和他要处理的事件相同,返回1,告诉调用socketReady的函数有socket准备好被处理了
4.sp->handlerMask & SOCKET_READABLE &&socketInputBuffered(sid) > 0
如果该socket要处理的事件是SOCKET_READABLE并且该socket的缓存中有可读的数据,则调用socketSelect函数,然后返回1,告诉调用socketReady的函数有socket准备好被处理了
5. socketSelect()
函数首先把各个sock感兴趣的事件(sp->handlerMask)注册给三个集合(读、写、例外),然后调用select系统调用,更新各个sock的sp->currentEvent表示各个sock的当前状态
这两个函数在sockGen.c中实现,主要操作的数据是socket_t变量socketList中的handlerMask和currentEvents,socketList在sock.c中定义并主要在该文件中socketAlloc,socketFree,socketPrt三个函数中维护
6.socketProcess()
1.socketDoEvent函数首先对socket的当前事件进行检查,如果是读事件并且是服务器监听socket上的读事件,说明有新连接到来,调用socketAccept()欢迎新连接,并使currentEvents为0,然后返回。
2.如果当前不是读事件但是该socket原感兴趣的读事件并socket缓存中确有数据可读,那就置currentEvents为可读
3.如果当前是写事件,那就看看该socket的写缓存中有没有数据,如果有并且有SOCKET_FLUSHING标志就全部输出该写缓存,这是为新的写事件做清理
4.调用事件处理函数sp-handler,该函数指针分别在两个地方进行初始化
(1) 在wbsDefaulthandler()函数中注册写事件
(2) 在websAccept()函数中注册读事件
5.把currentEvent置为0
goahead 流程的更多相关文章
- goahead webserver源码分析
1.一个txt文本架构图 main() | |--websOpenServer() | |-- websOpenListen() | ...
- 批量检测GoAhead系列服务器中Digest认证方式的服务器弱口令
最近在学习用python写爬虫工具,某天偶然发现GoAhead系列服务器的登录方式跟大多数网站不一样,不是采用POST等方法,通过查找资料发现GoAhead是一个开源(商业许可).简单.轻巧.功能强大 ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
- 基于netty http协议栈的轻量级流程控制组件的实现
今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?
在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- 8、Struts2 运行流程分析
1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...
- Hawk 6. 高级话题:子流程系统
子流程的定义 当流程设计的越来越复杂,越来越长时,就难以进行管理了.因此,采用模块化的设计才会更加合理.本节我们介绍子流程的原理和使用. 所谓子流程,就是能先构造出一个流程,然后被其他流程调用.被调用 ...
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
随机推荐
- 新建Microsoft Word文档
问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗?”,L大喜,一拍桌子,说:“好,就叫这个名字了.” ...
- simmon effect : build the funcion of trail list
#the real experiment for simon effect #load the library which is our need import pygame import sys i ...
- PWA - service worker - Workbox(未完)
Get Started(开始) 只有get请求才能cache缓存吗? Create and Register a Service Worker File(创建和注册 Service Worker) B ...
- Bubble Sort HDU - 5775 树状数组
//每个数字只会被它后面的比它小的数字影响,且会向右移动相应个数的位置 //比如:6 4 3 5 2 1 .4后面比它小的有 三个,因此它的最右边位置就是当前位置 +3,即5 //如果该数字本身在标准 ...
- H3C IP地址配置
一.IP地址分类 分配地址就是给每个连接到IPv4网络上的设备分配的一个网络唯一的地址.IP地址长度为32比特,通常采用点分十进制方式表示,即每个IP地址被表示为以小数点隔开的4个十进制整数,每个整数 ...
- Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机
动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...
- Codeforce 588A - Duff and Meat (贪心)
Duff is addicted to meat! Malek wants to keep her happy for n days. In order to be happy in i-th day ...
- xmind修改默认配置
XMIND使用过程中,输入英文字符的时候,第1.2层级的英文字母总是默认大写,手动修改很繁琐.默认字体,想切换成其他类型,也是要手动一个个去修改. 网上找了下相关的问题,找到一些解决办法,整理到文档中 ...
- [ZJOI2007] 矩阵游戏 - 二分图匹配
题意:问一个\(0-1\)方阵是不是非奇异的 其实我真的很想求行列式 #include <bits/stdc++.h> using namespace std; #define N 505 ...
- BK: How to read a book 第四篇
第四篇 阅读的最终目标 第二十章 阅读的第四个层次:主题阅读 在做主题阅读时的要求: 1. 知道:知道应该读哪些书. 在面对如此庞大的相关资料时,我们要如何决定我们要研究的主题是什么呢. 如何判断属于 ...