一、参考网址

  1、源码的github地址

二、网页是采用文件读写方式,还是转换为数组方式?

  1)其通过宏定义“WEBS_PAGE_ROM”来区分,我是在websPageReadData()(page.c)函数源码发现的

int websPageReadData(webs_t wp, char *buf, int nBytes)
{ #ifdef WEBS_PAGE_ROM
a_assert(websValid(wp));
return websRomPageReadData(wp, buf, nBytes);
#else
a_assert(websValid(wp));
return read(wp->docfd, buf, nBytes);
#endif
}

 2) 其保存网页的数组定义:websRomPageIndexType websRomPageIndex[], 其内部有个Page成员指向网页数组数据:

/*
* Compiled Rom Page Index
*/
typedef struct {
char_t *path; /* Web page URL path */
unsigned char *page; /* Web page data */
int size; /* Size of web page in bytes */
int pos; /* Current read position */
} websRomPageIndexType;

  3) websRomPageIndex[]数组初始化过程

      websRomOpen()

        symEnter(romTab, name, valueInteger((int) wip), 0); //填充到sym[romTab]中

  4) 从数组中读出网页的过程:

    websDefaultHandler 注册了写事件处理

      websDefaultWriteEvent

        websPageReadData

           websRomPageReadData

2、输入URL时,其默认网页定义

  在initwebs()函数中有UrlHandlerDefine(T("/"), NULL, 0, websHomePageHandler, 0); 

  其websHomePageHandler()定义如下:

static int websHomePageHandler(webs_t wp, char_t *urlPrefix, char_t *webDir,
int arg, char_t *url, char_t *path, char_t *query)
{
/*
* If the empty or "/" URL is invoked, redirect default URLs to the home page
*/
if (*url == '\0' || gstrcmp(url, T("/")) == ) {
websRedirect(wp, T("home.asp"));
return ;
}
return ;
}

3、浏览器提交的数据处理流程

  initWebs() (main.c)

    websOpenServer(port, retries);

      websOpenListen(port, retries);

        socketOpenConnection(NULL, port, websAccept, 0); 中的websAccept

          int websAccept(int sid, char *ipaddr, int port, int listenSid)

            socketCreateHandler(sid, SOCKET_READABLE, websSocketEvent, (int) wp);

              static void websSocketEvent(int sid, int mask, int iwp)

                void websReadEvent(webs_t wp)

                   websUrlHandlerRequest(wp)

                     sp = &websUrlHandler[i]; 其数组内容由websUrlHandlerDefine()函数填充           

                     if ((*sp->handler)(wp, sp->urlPrefix, sp->webDir, sp->arg,
                      wp->url, wp->path, wp->query))

                        int websFormHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,

                          char_t *url, char_t *path, char_t *query)

                             sp = symLookup(formSymtab, formName);// formSymtab数组内容由websFormDefine()函数填充

                             fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;

                             (*fn)((void*) wp, formName, query); 最后的表单处理函数,

4、对浏览器提交的数据处理,移植需要注意的两步(即最后两步)

  1)先由websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);中注册的websFormHandler()函数处理

    其内部有怎么一段:fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;

             (*fn)((void*) wp, formName, query); 

 int websFormHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
char_t *url, char_t *path, char_t *query)
{
printf("formhandler %s ----- %d\n", __func__, __LINE__);
sym_t *sp;
char_t formBuf[FNAMESIZE];
char_t *cp, *formName;
int (*fn)(void *sock, char_t *path, char_t *args); a_assert(websValid(wp));
a_assert(url && *url);
a_assert(path && *path == '/'); websStats.formHits++; /*
* Extract the form name
*/
gstrncpy(formBuf, path, TSZ(formBuf));
printf("path:%s\n", path);
printf("formbuf:%s\n", formBuf);
if ((formName = gstrchr(&formBuf[], '/')) == NULL) {
websError(wp, , T("Missing form name"));
return ;
}
//printf("111formname:%s\n", formName);
formName++;
//printf("222formname:%s\n", formName);
#if 1
if ((cp = gstrchr(formName, '/')) != NULL) //后续"/"之后的都失效
{
*cp = '\0';
}
#endif
//printf("333formname:%s\n", formName);
/*
* Lookup the C form function first and then try tcl (no javascript support
* yet).
*/
sp = symLookup(formSymtab, formName);
if (sp == NULL) {
websError(wp, , T("Form %s is not defined"), formName);
} else {
fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;
a_assert(fn);
if (fn) {
/*
* For good practice, forms must call websDone()
*/
(*fn)((void*) wp, formName, query); /*
* Remove the test to force websDone, since this prevents
* the server "push" from a form>
*/
#if 0 /* push */
if (websValid(wp)) {
websError(wp, , T("Form didn't call websDone"));
}
#endif /* push */
}
}
return ;
}

  2) 然后根据URL中判断是哪个表单,然后调用相应的在initWebs()函数中用websFormDefine()注册的回调函数:

      如:websFormDefine(T("gpio_p24"), on_gp24_set); 则表示URL中末尾是gpio_p24,则调用on_gp24_set()函数

int websFormDefine(char_t *name, void (*fn)(webs_t wp, char_t *path,
char_t *query))
{
//1 printf("formdefine %s ----- %d\n", __func__, __LINE__);
a_assert(name && *name);
a_assert(fn); if (fn == NULL) {
return -;
} symEnter(formSymtab, name, valueInteger((long) fn), );
return ;
}

3

goahead(web服务器)分析的更多相关文章

  1. java实现简单web服务器(分析+源代码)

    在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.为了简 ...

  2. web服务器分析与设计(一)

    自己写一个简单的服务器. 面向对象分析与设计第一步:获取需求(基于用例) 功能:1,支持html静态网页,2,支持常用HTTP请求,且容易扩展支持不现请求 3,可以发布站点 补充:至于对动态网页等高级 ...

  3. web服务器分析与设计(五)--一些总结

    随着年龄与经验的增加,对于软件方面的分析与设计也会有一些新的认识.下面做个近期的总结: 1,关于到底用不用作设计的问题: 在最近两个公司,原有人马是不会作设计(我自己的感觉),也察觉不到作设计的任何冲 ...

  4. web服务器分析与设计(四)

    上篇已经开始了系统内部的分析,并且得到一些分析对象.在整个动作场景中,我们得到了一些粗略的对象.有必要对对象进行分析,合并,再抽象. 实质是职责的合理分配,使得系统合乎功能性,同时得到最大的可扩展,可 ...

  5. web服务器分析与设计(三)

    面向对象分析与设计第二步:健壮性分析,完善对象 通过上一篇的分析,已经得到了构建系统中最重要的对象-----实体对象,它们封装着构成系统最重要的数据,实体数据是系统的生命. 但是光有实体还系统是运转不 ...

  6. web服务器分析与设计(二)

    面向对象分析与设计第二步:寻找对象,建立问题域模型 1,用例场景描述 接上一篇中的用例,编写用例场景 U1: 上网者:打开网站(www.xxx.com) 浏览器:连接网站 目标系统:接受连接 检查连接 ...

  7. goahead web 服务器

    https://blog.csdn.net/xieyihua1994/article/details/74002413

  8. Web服务器性能监控分析与优化

    Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html

  9. IIS Web服务器日志、日志服务器分析

    IIS Web服务器日志.日志服务器分析 EventLog Analyzer是一款全面的工具,用于审计.管理和跟踪您的Microsoft Internet Information Services(I ...

随机推荐

  1. 存储器HK1225-7EQ 使用说明书资料

    一. 引脚排列 二. 读取模式 HK1225在WE(写使能)被禁止(high)且CE(片选)被选中(Low)且CE2(片选2)被选中(High)并且OE(读信号)被使能(Low)执行一次读循环.13个 ...

  2. 记录第一次制作pypi包的过程

    准备工作 1.创建一个项目文件夹 mkdir dada_openapi_python cd dada_openapi_python 2.创建包文件夹 在里面在创建一个 dada_openapi_cli ...

  3. 二十三、JavaScript之html事件

    一.代码如下 二.效果如下 三.点击之后 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" ...

  4. 044-PHP获得多个类对应的反射信息

    <?php //获得多个类对应的反射信息 class demo{ public $str_1; private $str_2; protected $str_3; public function ...

  5. 095-PHP遍历关联数组,并修改数组元素值

    <?php $arr=array('I'=>1,'II'=>2,'III'=>3,'IV'=>4,'V'=>5); //定义一个数组 echo '修改之前数组信息: ...

  6. jQuery原理系列-工具函数

    jquery源码中有很多精妙的实现,对于我们每天都在使用的东西,一定要知其原理,如果遇到不能使用jquery环境,也能自己封装原生的代码实现. 1.检测类型 众所周知typeof 不能用来检测数据,会 ...

  7. POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算

    求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...

  8. (转)null和NULL和nullptr和””区别

    突然想到这个有趣的问题:C语言和C++对大小写是敏感的,也就是说null和NULL是区别对待的.NULL代表空地址,null只是一个符号.便来深究,看了很多资料,总结如下: 其实null和NULL都是 ...

  9. C++基础--string转

    有时候除了要将数值型转为string外,可能也需要将一些string转为数值型,这个时候也还是可以用sstream字符串流来实现,同时也可以用C++标准库得到函数来实现. 1.字符串流 这个时候使用i ...

  10. BZOJ:2243: [SDOI2011]染色

    题解: 树剖,线段树维护区间颜色段数 记录两端点的颜色,做到O(1)合并 问题: 非递归建树实现 #include<iostream> #include<cstdio> #in ...