移植:(boa-0.94.14rc21.tar)
./configure –host=arm-linux-gnueabihf-
Make
配置文件:
Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。
Boa.conf: 内容如下
端口
– Port 80,是缺省的HTTP端口,如果有程序占用,则要换一个
-ErrorLog 的修改
原始值发布一个自建的日志文件 ErrorLog /var/log/boa/error_log
在嵌入式设备,在调试可将其直接注释掉,这样会重定向的缺省错误输出,即串口上
正式发布,可直接 设为 ErrorLog /dev/null 即不输出.
-AccessLog的修改
注释时 AccessLog的值 dev/null,调试时,可以将其改为 AccessLog /dev/console 输出到串口
-ServerName的设置
修改 ServerName www.your.org.here为 ServerName <自己的主机名>
注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。
-DocumentRoot修改
DocumentRoot /var/www表示静态网页存放目录,用户访问都以为此为根目录
修改成你自己的静态网页目录 DocumentRoot /html
-User root
Group root : 因开发板没有Group 将Group root 注释掉
-DirectoryIndex的修改
缺省网页名字.即用户只输出路径,不带网页名字,BOA自动调用这个网页,缺省是调用index.html,前提DocumnetRoot必须有这个文件存在.
缺省值 DirectoryIndex index.html
CGIPath的修改
表示CGI程序在调用时,BOA查找CGI的路径顺序.为了保险,可以把ScriptAlias 所指向路径加到这里来
CGIPath /bin:/usr/bin:/usr/local/bin
scriptAlias的修改 (cgi的c文件存放目录)
修改 scrīptAlias /cgi-bin/ /usr/lib/cgi-bin/ 为 scrīptAlias /cgi-bin/ /cgi-html/
Boa所有的CGI程序应该放在这个目录下,注意最后的一个/,必须要有
BOA 运行前准备
如果采用缺省日志(即配置文件ErrorLog 所指向的)还需要创建日志文件所在目录/var/log/boa,
创建静态网页HTML文档的主目录,将静态网页存入该目录下,(即DocumentRoot指向的目录)
创建CGI脚本所在目录,将cgi的脚本和程序存放在该目录下.(即ScriptAlias 所指向的目录)
另外还要将mime.types文件复制/etc目录下,通常可以从linux主机的 /etc目录下直接复制即可。
执行时,如果boa.conf 在/etc/boa下,直接运行boa即可. 但boa.conf 在其它目录,需要-c 指示boa.conf所在目录
– 如果boa和boa.conf 在同一目录下,运行 ./boa –c .即可
BOA判断CGI程序原理
l BOA是通过用户发来URL(即浏览器里输入的网址)来判断是静态网页还是需要用CGI来处理
– 如果url的路径包括cgi-bin 这们路径(即scriptAlias前半部分),那么BOA认为这是是需要cgi程序处理.并把它后面的参数变成cgi程度的命令行参数去执行.否则是静态网页
– 如 http://192.168.0.146:8081/cgi-bin/hello.cgi
l 出现了cgi-bin,BOA把hello.cgi执行起来,如果hello.cgi正好是一个CGI程序,则进入CGI处理流程
Post get 方法:
Html:(静态网页目录: /html ; cgi c的目录 为 /cgi-html/cgi-bin/ )
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
"http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="js/jquery-1.8.3.min.js"></script>
<script>
function test() // jquery 通过后台获取数据
{
alert("enter fx");
$.ajax({
"type": "POST",
"url": "cgi-bin/test.cgi", // 注意是cgi-bin/test.cgi
"cache": false, //cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓//存里面读取而不是再到服务器端读取
"data": "name=John",
"dataType": "html"
}).done(function(data, status, xhr) {
if (status != 'success')
{
alert("fail");
} else {
alert(data);
}
})
}
</script>
<title>test.html</title>
</head>
<body >
<form action="cgi-bin/test.cgi" method="post" name="form1">
<input type="text" val =100 name="input_1">
<input type="text" val =200 name="input_2">
<input type="submit" val="submit">
</form>
<table>
<input type="button" id="00" val="key press " onclick="test()"/>
</table>
</body>
</html>
test.c (编译通过后将test.c 更名为test.cgi,然后放在cgi-html/cgi-bin/目录中)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * method;
char * p ;
int len;
char *post_buff;
int main(void)
{
method = getenv("REQUEST_METHOD"); // val 是 POST 或者GET
if(method==0)
{
printf("can't receive data from net ");
}
else if( strcmp(method,"POST")==0 ) //post 方法
{
printf("Content-type:text/html\n\n");
printf("<p>post method</p>");
p = getenv("CONTENT_LENGTH"); //获取POST的环境变量
if(p)
{
len =atoi(p);
printf("<p>len is %d</p>",len);
post_buff = malloc(sizeof(char)*len + 1); //必须申请缓存,因为stdin是不带缓存的
fread(post_buff,sizeof(char),len,stdin);//将POST的值读到post_buff
printf("%s",post_buff);
}
else
{
len =0;
printf("len is null");
}
}
else if ( strcasecmp(method,"get")==0) // GET 方法
{
printf("get method");
p = getenv("QUERY_STRING"); //从环境变量
}
}
应用框架:C:\Users\Administrator\Desktop\learning_linux\cgi-boa\cgi3
收到POST数据后,将数据写入到消息队列中,应用程序不停的get消息,如果有消息进入消息解析函数。
CGIC的编译:
1.从CGIC 的主站点http://www.boutell.com/cgic/ 下载源码,将其解压并进入源码目录
# tar -zxvf cgic205.tar.gz
# cd cgic205
2.修改Makefile 文件
找到CC=gcc ,将其改成CC=arm-linux-gcc ,
找到AR=ar ,将其改成AR=arm-linux-ar ,
到RANLIB=ranlib ,将其改成RANLIB=arm-linux-ranlib 。
找到gcc cgictest.o -o cgictest.cgi
LIBS,将其改成
L
I
B
S
,
将
其
改
成
(CC)
(CFLAGS)cgictest.o−ocgictest.cgi
(
C
F
L
A
G
S
)
c
g
i
c
t
e
s
t
.
o
−
o
c
g
i
c
t
e
s
t
.
c
g
i
{LIBS} ,
找到gcc capture.o -o capture
LIBS,将其改成
L
I
B
S
,
将
其
改
成
(CC)
(CFLAGS)capture.o−ocapture
(
C
F
L
A
G
S
)
c
a
p
t
u
r
e
.
o
−
o
c
a
p
t
u
r
e
{LIBS} ,
然后运行make 进行编译,得到的CGIC 库libcgic.a 。
将生成的libcgic.a 复制到工具链所在的路径中sudo cp libcgic.a /usr/arm-linux-gnueabihf/lib/
编译catture.c arm-linux-gnueabihf-gcc -o test capture.c cgic.h -L. -lcgic (不难看出静态库和动态库的使用方法是一致的)