原文: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 流程的更多相关文章

  1. goahead webserver源码分析

    1.一个txt文本架构图 main() | |--websOpenServer() |             |-- websOpenListen() |                       ...

  2. 批量检测GoAhead系列服务器中Digest认证方式的服务器弱口令

    最近在学习用python写爬虫工具,某天偶然发现GoAhead系列服务器的登录方式跟大多数网站不一样,不是采用POST等方法,通过查找资料发现GoAhead是一个开源(商业许可).简单.轻巧.功能强大 ...

  3. Linux下服务器端开发流程及相关工具介绍(C++)

    去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...

  4. 基于netty http协议栈的轻量级流程控制组件的实现

    今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...

  5. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

    在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...

  6. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  7. 8、Struts2 运行流程分析

    1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...

  8. Hawk 6. 高级话题:子流程系统

    子流程的定义 当流程设计的越来越复杂,越来越长时,就难以进行管理了.因此,采用模块化的设计才会更加合理.本节我们介绍子流程的原理和使用. 所谓子流程,就是能先构造出一个流程,然后被其他流程调用.被调用 ...

  9. 流程开发Activiti 与SpringMVC整合实例

    流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...

随机推荐

  1. Jungle Roads HDU - 1301 prim

    #include<stdio.h> #include<string.h> #include<iostream> using namespace std; ; int ...

  2. SQL Server Varchar 中文乱码问题与使用SQL Server Management Studio管理软件查询出来的字段限制

    问题:不管是用varchar 还是nvarchar,插入记录为中文时,都会显示乱码?? 即使建表时指明了某个字段的语言也没用 COLLATE Chinese_PRC_CS_AS_WS 原因:可能是安装 ...

  3. centos7中python2.7升级到python3.7

    一.下载源码包 # 切换到root目录 [root@localhost ~] cd /root/ # 安装wget [root@localhost ~] yum -y install wget # 使 ...

  4. 题解【洛谷P2264】情书

    题面 看到每一单词在同一句话中出现多次感动值不叠加,一眼想到 \(\text{set}\). 首先将词汇列表中的单词存储起来,我用的是 \(\text{set}\). 对于每一个句子的单词,我们可以先 ...

  5. python创建字典的三种方式

    创建空字典: dict_eq={} print(type(dict)) 直接赋值创建字典: dict_eq={'a':1,'b':2,'c':'adbc'} 通过关键字dict和关键字参数创建 dic ...

  6. SpringBoot学习- 4、整合JWT

    SpringBoot学习足迹 1.Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于 ...

  7. 洛谷P1170 兔八哥与猎人 欧拉函数的应用

    https://www.luogu.org/problem/P1170 #include<bits/stdc++.h> using namespace std; ],b[],c[],d[] ...

  8. 小匠第二周期打卡笔记-Task03

    一.过拟合欠拟合及其解决方案 知识点记录 模型选择.过拟合和欠拟合: 训练误差和泛化误差: 训练误差 :模型在训练数据集上表现出的误差, 泛化误差 : 模型在任意一个测试数据样本上表现出的误差的期望, ...

  9. Python之旅第二天(第一天补充部分、数据类型、运算逻辑、部分方法的引入、pycharm)

    今天其实是有点小忙的,但是干自己不喜欢事情的结果就是,要睡觉了都不知道自己在忙鸡毛,所以还是不继续想了,脑仁疼.回忆一下今天的学习内容,着实有点少,本大侠还没怎么过瘾呢.废话不多说. while补充两 ...

  10. Shell的 for 循环小例子

    <1> 上例子 for i in f1 f2 f3; do @echo $i; done 执行结果: f1 f2 f3 但是,请注意:如果是在makefile 中写,要写成这个样子: al ...