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 ...
随机推荐
- dede调出所有栏目以及栏目下的二级栏目
1.调出所有栏目以及栏目下的二级栏目 {dede:channelartlist typeid='top'}<a href="{dede:field name='typeurl'/}&q ...
- 换根dp
感觉这类问题很少?算了,还是拿出来水一下吧qwq... 首先来看一道例题:POJ3585 一句话题意:树上任意源点多汇点最大流 你看这不就是个最大流的板子题吗?我先建个图,然后跑最大流,然后,,,然后 ...
- 编程入门-Eclipse基本使用
编程入门-Eclipse基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设置Eclipse的基本参数 1>.修改Eclipse默认的文件编码为"utf- ...
- 每天一点点之 taro 框架开发 - taro静态资源引入
1.说明: taro中客园自由的引用静态资源,不需要安装任何的loader 引用样式文件 通过ES6的import引入 2.引用js文件 import { functionName } from '. ...
- storm on yarn安装时 提交到yarn失败 failed
最近在部署storm on yarn ,部署参考文章 http://www.tuicool.com/articles/BFr2Yvhttp://blog.csdn.net/jiushuai/artic ...
- BZOJ:3231: [Sdoi2008]递归数列
题解: 矩阵乘法,在矩阵中构造当前前缀和: 注意:for(int/long long ;;); #include<iostream> #include<cstdio> #inc ...
- Python Learning Day7
破解极验滑动验证 博客园登录url: https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F 代码逻 ...
- 第二阶段scrum-1
1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 注册登陆界面功能正在实装,消息收发功能正在制作 雷达界面已经完成.
- Aizu 2155 Magic Slayer 背包DP
这是上上次对抗赛的题目了 其实现在发现整个代码从头到尾,都是用了背包,怪我们背包没深入学好. 比赛的时候,聪哥提出的一种思路是,预处理一下,背包出 ALL攻击 和 single攻击的 血量对应的最小花 ...
- Maven - Eclipse例子
版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...