boa服务器移植与CGIC库的安装使用(转载)

原文链接: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\n\n");
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的基本思路:

从cgic.c的代码可以看出,它定义了main函数,而在cgictest.c中定义了一个cgiMain函数。也就是说,对于使用CGIC编写的CGI程序,都是从cgic.c中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,它才会调用你的代码(从你定义的cgiMain进入)。

另外一点就是,cgi程序输出HTML页面的方式都是使用printf把页面一行一行地打印出来,比如cgictest.c中的这一段代码:

fprintf(cgiOut, "<textarea NAME=\"address\" ROWS=4 COLS=40>\n");
fprintf(cgiOut, "Default contents go here. \n");
fprintf(cgiOut, "</textarea>\n");

上面这段代码的运行结果就是在页面上输出一个textarea。第一个参数cgiOut实际上就是stdin,所以我们可以直接使用printf,而不必使用fprintf。不过在调试的时候会用到fprintf来重定向输出。
这种方式与Java Servlet非常类似,Servlet也是通过调用打印语句System.out.println(…)来输出一个页面。(不过后来Java推出了JSP来克服这种不便。)
但是与Servlet不同的地方在于,使用C语言的我们还要自己输出HTML头部(声明文档类型):

cgiHeaderContentType("text/html");

这个语句的调用一定要在所有printf语句之前。而这个语句执行的任务实际上就是:

void cgiHeaderContentType(char *mimeType) {
   fprintf(cgiOut, "Content-type: %s\r\n\r\n", mimeType);
}

这个语句告诉浏览器,这次传来的数据是什么类型,是一个HTML文档,还是一个bin文件… 如果是个HTML文档,就通过浏览器窗口显示,如果是一个bin(二进制)文件,则打开下载窗口,让用户选择是否保存文件以及保存文件的路径。

 

使用capture进行调试时注意:  将capture和cgictest.cgi拷贝到主机的/nfs/www/cgi-bin目录下。
   在工作站的浏览器地址栏输入http://192.168.67.16/cgi-bin/cgictest.cgi,可以看到页面,表示CGIC库和测试脚本都移植成功。cgictest.cgi比较完整的展现了CGIC库的功能,在开发基于CGIC库的CGI程序前最好先掌握cgictest.cgi程序,也是用户开发特定应用程序时的参考范例。
   HTML模板的制作
Web方式的应用开发一般都会将界面和程序逻辑脱离开来,允许在一定程度下更改界面,如改变界面文本的属性,建立多语言版本等,而无需改动程序逻辑。界面一般由美工来进行制作,而程序员负责具体功能的实现。在 HTML中,表单 (FORM)是最主要的传递信息的手段,它适用于任何浏览器。表单中有很多元素,包括输入文本框,单选框,多选框,按钮,等等,可以提供信息的交互。具体对象说明和语法请参见其他HTML书籍,在这里不作介绍。根据应用需求,美工或其他设计人员将最后的Web页面设计出来,作为程序员进行开发的模板。
   CGI程序的工作一般就是接收表单数据,进行数据处理,最后根据处理结果生成新的页面返回给浏览器。表单数据一般是以POST方法提交给服务器,由CGI程序获得,程序必须要将界面数据和内部数据对应起来才能够进行下一步的处理。CGI程序从页面获取数据就根据元素名字/值中的元素名字来进行区分。但CGI返回页面就比较麻烦。由于界面在程序开发完成后还有可能会改变,而且有些需要程序处理的地方可能没有表单元素,因此对程序来说,不能以表单元素名作为区分的基础,一般方法是采用HTML中的注释<!-xxx-->来标记。
 
   程序员需要在模板中为每一个表单元素以及其他任何需要程序处理的地方,按照一定规则,如注释的下一行就是表单元素行,建立其注释标记。CGI程序就可以根据注释标记来判断表单元素信息并进行处理。程序逐行读取模板文件,检查有无注释标记,如有的话,则下一行需要进行处理,给表单元素赋上数据,最后就可以返回带数据的页面给浏览器。
   HTML模板还需要关注的是输入的检查。根据输入检查越早越好的原则,需要在用户界面上就对用户提交的数据进行检查。目前一般是采用javascript脚本的方式。当用户提交数据时,表单对象的onSubmit方法就会被调用,在该方法里就可以对用户的输入进行检查。常用的检查有是否必需、最大/小长度、是否字符、是否数字、email地址、IP地址是否正确、是否匹配一个正则表达式等。

 

使用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>\n");
fprintf(cgiOut, "<TITLE>My First CGI</TITLE></HEAD>\n");
fprintf(cgiOut, "<BODY><H1>Hello CGIC</H1></BODY>\n");
fprintf(cgiOut, "</HTML>\n");
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\n\n");  
    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

posted @ 2020-07-01 18:29  前方路wx  阅读(896)  评论(0编辑  收藏  举报