goAhead WebServer在VxWorks上的移植
goAhead是一款功能比较全的开源嵌入式web servergoAhead支持asp,嵌入式javascript,CGI以及静态页面html格式。快速响应,每秒可处理超过50个请求。如果不包含SSI,仅要求60K的内存;包含SSI,要求500K内存。web页面可以存在ROM或文件系统中。支持多种操作系统,包括vxWorks,LINUX,Windows,WinCE,pSOS等。
(一)编译源代码
1,我使用的VxWorks开发环境是Tornado2.2,把goAhead所有的源码加到自己VxWorks image编译环境中,这个步骤可以使用Tornado来做,也可以直接修改makefile文件,建议直接修改makefile。
2,定义5个宏,-DWEBS_PAGE_ROM -DWEBS -DUEMF -DOS=\–DVXWORKS
makefile可以把宏传递给源文件,作用就相当于在预编译的每个每个文件中定义了这样的宏。
比如你要定义宏 WEB,就可以直接在cc后面加-Dmacro: $(CC) -DWEB
3,编译时你会发现编译不通过,说websSSL.c出错,好的,我们把这个文件remove掉,另外webcomp.c也要去除,一切ok。
(二)加入web页面文件。
web页面在iamge中存放形式有2种,一是按原目录存放在嵌入式文件系统中,二是把所有的页面文件压缩后存为静态全局数组。
嵌入式应用中大部分没有标准的文件系统,所以这里我们也使用静态数组的方式。
源码中判断一个宏“WEBS_PAGE_ROM”,如果没有定义这个宏,他就按标准的read文件方式去文件系统中取页面文件数据;
如果定义了这个宏就到数组中取数据。这就是为什么我前面要定义一个WEBS_PAGE_ROM宏。
另外在main.c中要把根路径修改成webs #define ROOT_DIRT(\(三)如何把页面文件压缩进数组
goAhead想得很周全,专门为压缩进数组写了一个文件合并程序,就是webcomp.c,在linux中编译这个文件。
进入linux子目录,修改Makefile文件,加入下面的内容: comp:
$(CC) -I../ -I./ -o webcomp $(DEBUG) $(CFLAGS) $(IFLAGS) $(LDFLAGS) ../webcomp.c
find ../web -name \./webcomp ../web websfile > ../webrom.c
执行make comp最后有点错,不要理会。
这样../webrom.c内容已经被修改,大小看你的web页面文件的总大小了,我把goAhead中的web压缩了有1M。
然后把这个webrom.c考过来替换你的webrom.c。 (四)启动web server服务
web server只用了系统的socket协议栈和定时器,自己没有建任务,所以为了性能监视方便,建议专门建一个任务给他。
这样web server的内存使用,任务状态就可以看到了。
如果不建任务就要在别的任务,或者干脆在usrAppinit()中加入web server入口“main(0,0)”。
到此为止全部结束,我的程序用了1M,页面上面说过1M,这样image增加了2M!!!,太大了。
对于有些OS没有完整的TCP stack,对于goAhead web server的移植就有点麻烦了,还得按照标准的协议栈补全。
Goahead在ArmLinux下的移植
main.c(主程序)
是web服务器的主要,也就是启动函数。
int websvxmain(int argc, char **argv)
功能:goahead web服务器的启动的第一个函数。 说明:
1. 判断命令中有没有-demo,有则,代码中包含/wwwdemo/目录下的页面对应的cgi程序,该目录下是一些例子程序。 2. 分配一个60k的内存空间。 3. 初始化web服务器。
4. 然后进入while循环,在打开的socket数组中寻找是否有一个socket需要处理(socketReady);如果没有,则等待2秒,发现有可读、可写socket
(socketSelect)。如果有则进行处理(socketProcess)。对于cgi程序需要进行输出数据到浏览器,释放内存(websCgiCleanup),还进行emfSchedProcess(以后再说)
5. while循环之外,umclose、关闭web服务器、关闭socket,这些主要是释放分配的内存。
-----------------------------------------------------------------------------------------------------------------
static int initWebs(int demo) 功能:初始化web服务器。 说明:
1. 用到的全局变量的初始化,打开sym hash table、打开用户管理,注册UM tables。
2. 从配置文件umconfig.txt中恢复um的数据。 3. 获得web服务器所在主机上的ip地址等信息。
4. 确定web服务器的根目录,对于例子程序,根目录是/ata0/webs/wwwdemo,这个只是例子,真正的根目录是/ata0/webs/www. 5. 设置默认的目录为/ata0/webs/www.
6. 设置默认的页面和密码(websSetDefaultPage(T(\
websSetPassword(password);),默认页面有用,密码没有用到,没啥用。默认页面主要是当websDefaultHandler处理的url请求时,如果url只是路径,没有页面时,就调用这个页面。
7. 然后建立socket,listen。(websOpenServer)
8. 创建几个处理句柄,分别对应认证(websSecurityHandler),gofrom处理(websFormHandler),标准cgi处理(websCgiHandler),page(html、css、image)、asp处理(websDefaultHandler)。
9. 然后是两个例子程序,分别对应goform、asp,移植web服务器时,将其注释掉。
10. 然后是用户管理对应的页面的asp、goform程序,移植web服务器时不需要这些。
11. 然后定义一个默认主页面,也就是当用户登陆到web服务器是,输入ip地址,能够自动跳到的页面,也就是更目录“/”时,例如193168.12.12或192.168.12.12/。移植时,根据具体情况自己修改。 12. 然后是SIGTERM、SIGKILL两个信号的处理程序。
-----------------------------------------------------------------------------------------------------------------
static int aspTest(int eid, webs_t wp, int argc, char_t **argv) 功能:一个asp的例子。
说明:也就是/wwwdemo/asptest.asp上对应的asp处理函数。
-----------------------------------------------------------------------------------------------------------------
static void formTest(webs_t wp, char_t *path, char_t *query) 功能:一个form例子。 说明:
-----------------------------------------------------------------------------------------------------------------
static int websHomePageHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, char_t *url, char_t *path, char_t *query) 功能:主页面处理函数
说明:当输入的只是ip地址,或者有ip地址和根路径“/”,跳到该函数定义的页面去。
-----------------------------------------------------------------------------------------------------------------
static void websTermSigHandler(int signo) 功能:SIGTERM、SIGKILL信号处理函数 说明:主要释放内存。
-----------------------------------------------------------------------------------------------------------------
Um.c(用户管理)
umconfig.txt
---------------------------------------- TABLE=users ROW=0
name=admin password=Uz
group=Administrator prot=1 disable=0
TABLE=groups ROW=0
name=Administrator priv=4 method=3 prot=1 disable=0
TABLE=access ROW=0
name=/main.html method=3 secure=0
group=Administrator
-------------------------------------
GoAhead提供了认证功能:主要是两种认证基本认证和摘要认证。摘要认证比基本认证更安全些,所以选择摘要认证。 认证功能其实是用户管理功能的一部分。要配置认证功能,需要修改umconfig.txt文件,GoAhead在启动时会读取该文件,实现认证功能。 文件大概情况如下:
TABLE=users/*用户配置*/ ROW=0
name=raise/*用户名*/
password=Uz/*密码,加密的*/ group=RS/*用户所属的组*/
prot=1/*为1表示这个用户受保护不能被删除,0表示可以删除*/ disable=0/*0为使能*/
TABLE=groups/*组配置*/