原文链接:https://blog.csdn.net/weixin_39148042/article/details/81221965
1.boa服务器的移植
准备文件:boa服务器的源码,或者用自己保存的已修改文件
源码下载:boa-0.94.13.tar.gz 链接:https://pan.baidu.com/s/13pSIqRU47xkjInVfFDMorQ 密码:m7eg
解压源码:tar -xvf boa-0.94.13.tar.gz
安装需要工具bison,flex: sudo apt-get install bison flex -y
进入解压文件夹的src文件夹内修改注释掉一些语句:
修改 src/compat.h:
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
修改 src/log.c:
注释掉
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
修改src/boa.c:
注释掉下面两句话:
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
注释掉下面语句:
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
修改src/defines.h
将 #define SERVER_ROOT "/etc/boa"
修改为: #define SERVER_ROOT "/boa" //此处为boa服务器位置,根据自己设置的位置填写正确,
(这样boa程序启动时会在/boa目录下寻找boa.conf配置文件,并且将/boa文件夹作为服务器的根目录)
cd boa-0.94.13/src/
执行./configure
这是根据configure.in文件进行一系列的配置,生成config.status,configure,和Makefile文件。
如果无法执行,考虑权限,修改该目录下的configure的属性为可执行 chmod 755 configure
对于在开发板上运行,修改Makefile: CC = arm-linux-gcc CPP = arm-linux-gcc–E。输入make命令进行编译
文件瘦身:strip boa(ubuntu下测试) 或 arm-linux-strip boa(板子上运行)
Boa的配置(修改boa.conf文件,可以修改源码解压包内的,也可以新建一个或用已完成修改的):
vi boa.conf, //几乎全部指定到boa的目录下,这样方便我们进行管理
重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机制
Port 80
User 0
Group 0
# bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址
#Listen 192.68.0.5
##### error_log和access_log会自动生成,只要指定生成路径就可以了。
ErrorLog /boa/log/error_log
AccessLog /boa/log/access_log
##### 存放HTML文件的根路径
DocumentRoot /boa/www
UserDir public_html
##### 默认页面,若输入http://127.0.0.1/则会自动返回给浏览器默认页面index.html
DirectoryIndex index.html
##### 保持默认
DirectoryMaker /boa/boa_indexer //被修改
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /boa/mime.types //被修改
DefaultType text/plain
#####指定传给cgi程序的PATH环境变量
CGIPath /bin:/usr/bin:/usr/local/bin
#####保持默认
Alias /doc /usr/doc
#####如果输入http://127.0.0.1/cgi-bin/test.cgi, 则boa服务器会到/boa/cgi-bin中寻找test.cgi程序。
ScriptAlias /cgi-bin/ /boa/cgi-bin/
建立安装目录:(这里是在将boa的服务器设置在 根目录 /boa 下的前提下进行,对于其他目录,注意修改)
mkdir -p /boa /boa/www /boa/cgi-bin /boa/log
将需要的文件复制到安装目录中
将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa下
将boa-0.04.13目录下的boa.conf文件复制到/boa下
将/etc/mime.types复制到/boa目录下
此时整个boa服务器移植完成,但是还需要测试boa服务器是否移植成功
测试boa服务器移植是否成功:
需要用到cgi文件 和 html文件(都是测试文件,可以自己写);也可以网上下载。
cgi文件下载:链接:https://pan.baidu.com/s/1k_tYw1D3alir_X-uCN9Jeg 密码:cksr
html文件下载:链接:https://pan.baidu.com/s/1bwRGrI8JjKrTILX8nwbSLg 密码:3bx5
将解压得到的cgi-bin目录(存放cgi相关的文件)和www目录(存放html相关的文件)直接覆盖boa服务器中的cgi-bin和www目录
查看图片中 cgi-bin目录以及www目录下存放的文件,
Demo:
新建一个wxdtest.c
#include <stdio.h>
int main() {
printf("Content-type:text/html
");
printf("Hello,World!");
return 0;
}
执行 gcc -o wxdtest wxdtest.c
将生成的wxdtest放到 工作目录 /boa/cgi-bin/ 里面
运行 ./boa
浏览器中输入进行访问:http://192.168.1.103/cgi-bin/wxdtest
CGIC库的安装使用:
解压压缩包:cgic205.tar.gz 得到 cgic205 文件夹,此为CGIC库。
对于CGIC库中的文件说明:
cgic.h:头文件;
cgic.c:CGIC的源代码文件;
cgictest.c:CGIC库的作者提供的一个CGI程序例子;可进行重点测试学习
capture.c:用于调试CGI程序的工具;
Makefile:安装CGIC的脚本文件;
可以看到,整个库实际上就是cgic.c一个文件,可以说是非常的精炼。
我们可以把CGIC安装为操作系统的一个动态链接库,这样我们每次编译的时候,就不需要有cgic.c这个源文件了。
但是由于需要(以后将会看到),我们将修改cgic.c代码,所以我们不把它安装进系统。每次编译的时候,只要把cgic.c和cgic.h放到当前文件夹就好了。
从cgic.c的代码可以看出,它定义了main函数,而在cgictest.c中定义了一个cgiMain函数。也就是说,对于使用CGIC编写的CGI程序,都是从cgic.c中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,它才会调用你的代码(从你定义的cgiMain进入)。
另外一点就是,cgi程序输出HTML页面的方式都是使用printf把页面一行一行地打印出来,比如cgictest.c中的这一段代码:
fprintf(cgiOut, "Default contents go here. ");
fprintf(cgiOut, "</textarea> ");
上面这段代码的运行结果就是在页面上输出一个textarea。第一个参数cgiOut实际上就是stdin,所以我们可以直接使用printf,而不必使用fprintf。不过在调试的时候会用到fprintf来重定向输出。
这种方式与Java Servlet非常类似,Servlet也是通过调用打印语句System.out.println(…)来输出一个页面。(不过后来Java推出了JSP来克服这种不便。)
但是与Servlet不同的地方在于,使用C语言的我们还要自己输出HTML头部(声明文档类型):
这个语句的调用一定要在所有printf语句之前。而这个语句执行的任务实际上就是:
fprintf(cgiOut, "Content-type: %s ", mimeType);
}
这个语句告诉浏览器,这次传来的数据是什么类型,是一个HTML文档,还是一个bin文件… 如果是个HTML文档,就通过浏览器窗口显示,如果是一个bin(二进制)文件,则打开下载窗口,让用户选择是否保存文件以及保存文件的路径。
Web方式的应用开发一般都会将界面和程序逻辑脱离开来,允许在一定程度下更改界面,如改变界面文本的属性,建立多语言版本等,而无需改动程序逻辑。界面一般由美工来进行制作,而程序员负责具体功能的实现。在 HTML中,表单 (FORM)是最主要的传递信息的手段,它适用于任何浏览器。表单中有很多元素,包括输入文本框,单选框,多选框,按钮,等等,可以提供信息的交互。具体对象说明和语法请参见其他HTML书籍,在这里不作介绍。根据应用需求,美工或其他设计人员将最后的Web页面设计出来,作为程序员进行开发的模板。
使用CGIC库的实践demo:
新建一个目录名为 mytest,里面拷贝这几个文件:cgic.c cgic.h
新建测试文件mytest.c 以及 Makefile文件
mytest.c中的内容
#include <stdio.h> #include "cgic.h" #include <string.h> #include <stdlib.h> int cgiMain() { cgiHeaderContentType("text/html"); fprintf(cgiOut, "<HTML><HEAD> "); fprintf(cgiOut, "<TITLE>My First CGI</TITLE></HEAD> "); fprintf(cgiOut, "<BODY><H1>Hello CGIC</H1></BODY> "); fprintf(cgiOut, "</HTML> "); return 0; }
Makefile中的内容,注意第二行开头要为大写锁定下的Tab键位
mytest.cgi:cgic.h cgic.c gcc mycgictest.c cgic.c -o mytest.cgi clean: rm -f *.o *.a *.cgi
执行 make 得到 mytest.cgi 将此文件复制到工作目录cgi-bin中
浏览器输入查看效果:http://192.168.1.103/cgi-bin/mytest.cgi
从html页面获得数据,并对请求作出处理
1、代码部分:
index.html:
<html> <head><title>CGI登陆</title></head> <body> <form name="login" action="../cgi-bin/login.cgi">姓名:<input type="text" name="name" /> <br/>密码:<input type="password" name="pwd" /> <br/>确定:<input type="submit" value="登陆" /> </form> </body> </html>
login.c
#include<stdio.h> #include<stdlib.h> int main() { char *date; char name[50],pwd[20]; printf("content-type:text/html;charset=gb2312 "); printf("<TITLE>登陆结果</TITLE>"); printf("<H3>登陆结果</h3>"); date=getenv("QUERY_STRING"); if(date==NULL) printf("<p>错误:数据没有被输入或数据传输发生错误</p>"); else { sscanf(date,"name=%[^&]&pwd=%s",name,pwd); printf("<p>name=%s</p>",name); printf("<p>pwd=%s</p>",pwd); printf("%s",date); } return 0; }
2、操作流程:
将index.html拷贝到先前我们创建的/home/boa/www目录下;
执行#gcc login.c -o login.cgi(在PC平台)生成执行文件login.cgi;
执行#arm-linux-gcc login.c -o login.cgi -static(在ARM平台)生成执行文件login.cgi;
并将login.cgi拷贝到前几节创建的/home/boa/cgi-bin目录下
执行#./boa
在浏览器地址栏输入http://192.168.1.101回车,产生如下图所示:
在姓名和密码分别输入值,点击登录按钮,进入如下界面:
对于CGIC库的详细、高级应用学习链接:https://blog.csdn.net/chinacodec/article/details/5792045