概述
GoAhead WebServer 是世界上最受欢迎的嵌入式Web 服务器。它简单,小巧,是高效托管嵌入式web应用程序的理想选择。
GoAhead 经过优化,可通过事件驱动的的单线程内核托管动态嵌入式web应用程序,它非常紧凑( 115K代码)。
应用范围
GoAhead Web服务器是部署最广泛的嵌入式Web服务器,在数亿中设备中使用,包括:网络设备、电话、工厂自动化、数据采集、医疗设备、移动设备以及消费和办公设备。
goahead 特性
- 支持ASP
- 嵌入式的javascript
- 标准的CGI
- 执行内存中的CGI处理GoFroms
- 扩展的API快速响应,每秒可处理超过50个请求
- 完全和标准兼容
如果不包含SSI,仅要求60K的内存;包含SSI,要求500K内存
web页面可以存在ROM或文件系统中
支持多种操作系统,包括eCos 、Linux 、LynxOS 、QNX 、VxWorks 、WinC
Goahead 核心
ASP过程
在看完开发手册【官方介绍】之后,ASP过程其实就是JST模板的编写,
- 在goahead 服务器中,网页以 .asp 的拓展名保存,asp是一种动态服务界面;
- 在ASP网页中使用GoAhead JavaScript 时,需要使用<% 函数(参数, …) %) 进行使用;
- Goahead 将提供javascript的解析函数,来对解析脚本函数,参数传递,函数对应C语言实现的注册以及C函数称为JS的一个全局函数。
- 在goahead源码中使用一个自己定义的c函数,这个c函数通过调用goahead服务器中API函数 websAspDefine 向服务器注册此c函数,这样此c函数便成为了Ejscript的一个全局函数,负责具体实现Ejscript查询显示信息的功能。
GoAction 过程
goaction 是一个URL处理器 官方介绍
注: 从3.X 版本之后更新为从GoForms 更新为GoAction
cgi 程序
通用网关接口(CGI)是用于将外部应用程序与WEB服务器接口的标准 官方介绍
- CGI脚本用可以从标准输入中读取,写入标准输出中以及访问环境变量的任何语言编写;
- cgi程序的请求构建时指定"/cgi-bin/ " 的URI前缀标识;
- cgi程序和脚本名称接在"/cgi-bin/ “后面,例如”/cgi-bin/ Name.cgi";
- CGI程序和脚本存储在文档根目录之外的特殊CGI目录中,需要在route.txt中设置;
- 运行CGI程序时,GoAhead CGI处理程序通过环境变量将请求信息传达给CGI程序;
goahead Linux 搭建
搭建环境:ubuntu 18.04
源码版本:goahead 4.1.3
1、下载goahead 源码, 解压
2、执行 ./configure
4、执行编译 make
5、编译完成之后根据提示进行安装 make install安装完成之后会自动创建相关文件:
程序生成文件:在当前目录下bulid/linux-x86-default/bin下
goahead配置文件:在/etc/goahead下
goahead默认文档录:/var/www/goahead
6、在goahead-4.0.2/src目录下找到self.key和self.crt文件,将这两个文件拷贝到/etc/goahead目录下(如果不这么做,启动时会提示读不到这两个文件,从而导致启动失败)
7、启动goahead进入bulid/linux-x86-default/bin下./goahead -v --home /etc/goahead /var/www/goahead 0.0.0.0:1314
打开浏览器,访问1314端口
CGI 程序部署
1、编译cgi 文件
2、配置/etc/goahead/route.txt 文件的参数, 这里要注意的是dir 这个参数 这是根目录, 需要设置为cgi 文件所在的路径。
##
在route.txt文件里的route uri=/cgi-bin dir=根路径 handler=cgi设置根路径,最终的路径为:根路径/cgi-bin,如设置根路径为/mnt/nfs/goheah12/,则cgi文件存放的路径为/mnt/nfs/goheah12/cgi-bin
###
3、如下图所示,main.cgi 所在的路径,文件目录是自己创建的。
4、运行goahead 组件。
5、访问update.html。
6、成功访问了cgi 文件。
update.html
这两个文件都是看别人博客的
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户登陆验证</title>
</head>
<body>
<form name="form1" action="/cgi-bin/main.cgi" method="POST">
<table align="center">
<tr><td align="center" colspan="2"></td></tr>
<tr>
<td align="right">用户名</td>
<td><input type="text" name="Username"></td>
</tr>
<tr>
<td align="right">密 码</td>
<td><input type="password" name="Password"></td>
</tr>
<tr>
<td><input type="submit" value="登 录"></td>
<td><input type="reset" value="取 消"></td>
</tr>
</table>
</form>
</body>
</html>
~
main.cgi
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
fprintf(stdout, "Content-Type: text/html\r\n\r\n");
char name[128];
char passward[128];
char buf[128];
char *data;
int len,i,m,n;
char *method;
method = getenv("REQUEST_METHOD");
printf("method = %s\n",method);
memset(name , 0 , sizeof(name));
memset(passward , 0 , sizeof(passward));
fscanf(stdin, "Username=%[^&]&Password=%s",name,passward);
if(name[0] == '\0' || passward[0] == '\0')
printf("name or passward error!");
else
printf("name=%s passward=%s\n",name , passward );
fprintf(stderr, "passward = %s\n",passward);
fprintf(stderr, "name = %s\n",name);
len = atoi(getenv("CONTENT_LENGTH"));
fprintf(stderr, "len = %d\n",len);
fprintf(stdout, "$STATE$=1");
return 0;
}
GoAction 开发
1、这个在网上的资料很少,而且案例还不完整,只知道在写完C函数之后需要WebsFormDefine()函数进行注册。于是找这个函数调用的位置和函数所在的位置。可以看到函数在goahead.h 中被定义,然后在其他的C文件中都调用了goahead.h 。 所以在这些C文件中都可以使用
WebsFormDefine()函数。
2、在别人的博客中的代码是添加在 main.c 的initWeb()中,但是新版本没有这个文件,也找不到文件,但是在http.c 中有这个函数。
3、在http.c 的如下位置添加代码
4、在/var/www/goahead/ 中添加html页面代码
5、使用make 重新编译
sudo ./configure
sudo make
sudo make install
6、运行 ./goahead -v --home /etc/goahead /var/www/goahead 0.0.0.0:1314
7、访问
8、随便输入一些信息,会跳转到带有goform 路径中。
http.c 文件中要加的内容
static void actionTest(Webs *wp)
{
cchar *name, *address;
name = websGetVar(wp, "name", NULL);
address = websGetVar(wp, "address", NULL);
websSetStatus(wp, 200);
websWriteHeaders(wp, -1, 0);
websWriteEndHeaders(wp);
websWrite(wp, "<html><body><h2>name: %s, address: %s</h2></body></html>\n", name, address);
websFlush(wp, 0);
websDone(wp);
}
//加载initWebs ()函数中
websDefineAction("test", actionTest); // 注册函数
form.html
中的action,url 会直接传送到http.c中的initWeb 函数中,然后通过 websDefineAction("test", actionTest); 把参数传到actionTest() 进行处理。<html>
<!-Copyright(c) Go Ahead software Inc.,2012-2012.All Rights Reserved.->
<head>
<title>Goahead Form Test </title>
<link rel="stylesheet" href="style/normal_ws.css" type="text/css">
</head>
<body>
<h1>Goahead Form Test 1111</h1>
<form action=/goform/test method=POST>
<table>
<tr>
<td>Name:</td><td><input type=text name=name size=50 value=""></td>
</tr>
<tr>
<td>Addr:</td><td><input type=text name=addr size=50 value=""></td>
</tr>
<tr>
<td></td>
<td ALIGN="CENTER">
<input type=submit name=ok value="OK"> <input type=submit name=ok value="CANCEL"></td>
</tr>
</table>
</form>
</body>
</html>
参考资料
开发文档
https://www.embedthis.com/goahead/doc/developers/handlers.html