goahead流程

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流程)