原文: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,websSecurityHandler,
WEBS_HANDLER_FirsT);
websUrlHandlerdefine(T("/goform"),websFormHandler,0);
websUrlHandlerdefine(T("/cgi-bin"),websCgiHandler,0);
websUrlHandlerdefine(T(""),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("/"),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 流程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)