嵌入式web框架 goahead 搭建

概述

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

  • 会自动解析 /action/ 或者 /goform/ 之后的内容
  • 在表单中用于 <form action=/action/NAME method="post">
  • 随后将解析后的内容NAME 调用注册函数来处理请求,运行绑定的C函数。 注册函数是
    websDefineAction(‘name’,name) 或者 websFormDefine() ;
  • 表单POST的信息由API函数websGetVar来进行处理;
  • GoAction是直接绑定到特定URI的 C语言函数。他们响应客户请求,而无需为每个请求创建新的流程。通过与GoAhead共享地址空间,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

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值