goahead(web服务器)分析
一、参考网址
二、网页是采用文件读写方式,还是转换为数组方式?
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服务器)分析的更多相关文章
- java实现简单web服务器(分析+源代码)
在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.为了简 ...
- web服务器分析与设计(一)
自己写一个简单的服务器. 面向对象分析与设计第一步:获取需求(基于用例) 功能:1,支持html静态网页,2,支持常用HTTP请求,且容易扩展支持不现请求 3,可以发布站点 补充:至于对动态网页等高级 ...
- web服务器分析与设计(五)--一些总结
随着年龄与经验的增加,对于软件方面的分析与设计也会有一些新的认识.下面做个近期的总结: 1,关于到底用不用作设计的问题: 在最近两个公司,原有人马是不会作设计(我自己的感觉),也察觉不到作设计的任何冲 ...
- web服务器分析与设计(四)
上篇已经开始了系统内部的分析,并且得到一些分析对象.在整个动作场景中,我们得到了一些粗略的对象.有必要对对象进行分析,合并,再抽象. 实质是职责的合理分配,使得系统合乎功能性,同时得到最大的可扩展,可 ...
- web服务器分析与设计(三)
面向对象分析与设计第二步:健壮性分析,完善对象 通过上一篇的分析,已经得到了构建系统中最重要的对象-----实体对象,它们封装着构成系统最重要的数据,实体数据是系统的生命. 但是光有实体还系统是运转不 ...
- web服务器分析与设计(二)
面向对象分析与设计第二步:寻找对象,建立问题域模型 1,用例场景描述 接上一篇中的用例,编写用例场景 U1: 上网者:打开网站(www.xxx.com) 浏览器:连接网站 目标系统:接受连接 检查连接 ...
- goahead web 服务器
https://blog.csdn.net/xieyihua1994/article/details/74002413
- Web服务器性能监控分析与优化
Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html
- IIS Web服务器日志、日志服务器分析
IIS Web服务器日志.日志服务器分析 EventLog Analyzer是一款全面的工具,用于审计.管理和跟踪您的Microsoft Internet Information Services(I ...
随机推荐
- Python练习题3
1.九九乘法表 li = [1,2,3,4,5,6,7,8,9] for i in li: for j in li: if i >= j: print(i,'*',j,'=',i*j,end=& ...
- 解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
在项目中添加src中添加NativeIO类 /** * Licensed to the Apache Software Foundation (ASF) under one * or more con ...
- EBP寻址
一.EBP寻址 ESP:栈顶指针 (程序对与堆栈的使用 使用到哪里,esp就是哪里) EBP: 栈底指针 之前都是借用ESP去寻址确定一些参数 ,但如果存到堆栈里面的值过多,那么就得不断地调整ESP ...
- OpenJudge - NOI - 1.1编程基础之输入输出(C语言 全部题解)
01:Hello, World! #include <stdio.h> int main(void) { printf("Hello, World!"); return ...
- Django——整体结构/MVT设计模式
MVT设计模式 Models 封装数据库,对数据进行增删改查; Views 进行业务逻辑的处理 Templates 进行前端展示 前端展示看到的是模板 --> 发起 ...
- 一百零二、SAP中ALV事件之十五,让ALV表格自动求和
一.代码如下 二.运行之后,效果如图,表头多了一个求和符号E,最下面一行会列出求和的相关信息 完美
- 四十九、在SAP中查看程序资源结构对象
一.在屏幕上点击这个品图标,相关说明如下图 二.使用这个程序资源结构对象可以很方便的定位
- 如何在Windows系统下使用you-get下载网上的媒体资源
关于you-get的专业介绍可以点击这个链接:中文说明 1,首先你要在你的电脑上安装python环境 Windows系统下: 首先,你需要去官网下载相应的版本: 也可以下载我网盘里的(注意看好自己的电 ...
- 留学英文论文写作Abstract三种类型
所谓Abstract,就是对所写论文主要内容的精炼概括.Abstract是美国人的说法,英国的科技期刊喜欢称之为Summary.在英文中,有资料是这么对其定义的:Abstract is a sketc ...
- 腾讯云服务器上搭建 2.176.3-1.1 版本的Jenkins,jdk 11
[root@VM_0_12_centos fonts]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@VM_0 ...