BOA+CGIC嵌入式web服务器开发

#基础知识
+ CGI(Common Gateway Interface)是外部应用扩展应用程序与WWW服务器交互的一个标准接口。按照CGI标准编写的外部扩展应用程序可以处理客户端浏览器输入的数据,从而完成客户端与服务器的交互操作。在BOA服务器上,运行产着一个守护进程对端口进行监听,等待来自客户的请求。当一个请求到来时,将创建一个子进程为用户的连接服务。服务器通过CGI与外部程序和脚本之间进行交互,根据客户端在进行请求时所采取的方法,服务器会收集客户所提供的信息,并将该部分信息发送给指定的CGI扩展程序。CGI扩展程序进行信息处理并将结果返回服务器,然后服务器 对信息进行分析,并将结果发送回客户端。
+ 外部CGI程序与BOA服务器进行通信、传递有关参数和处理结果是通过环境变量、命令行参数和标准输入来进行的。CGI的标准输入是服务器的标准输出,而CGI的标准输出是服务器的标准输入。客户的请求通过服务器的标准输出传送给CGI的标准输入,CGI对信息进行处理后,将结果发送到它的标准输入,然后由服务器将处理结果发送给客户端。
+ 当有数据从客户端浏览器传到Web服务器后,web服务器会根据传送的类型(基本有二类:GET/POST),将接收到的数据传入 QUERY_STRING或变量中, CGI程序可以通过标准输入,在程序中接收web服务器接收的数据。当要向浏览器发送信息时,只要向Web服务器发送特定的文件头信息,即可通过标准输出将信息发往Web服务器, Web服务器处理完由CGI程序发来的信息后就会将信息发送给浏览器。


#Ubuntu14.04LTS搭建BOA-CGI开发环境
参考网址:https://www.linuxidc.com/Linux/2013-07/87375p2.htm
成功启动后,当然要看看是否真正可以通过浏览器看到服务器中的网页。打开网页,输入本机的ip,回车就可以看到教程
里编辑的index.html所展现的页面了。
##问题集锦
(1)问题1
执行./boa后通过ps -a查看并没有boa进程,查看/var/log/boa的error_log显示为“boa.c:226 - icky Linux kernel bug!: Success”,修改boa.c中的


if (setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
---------->改为
#if 0
if (setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
#endif


#cgic开发实战
##准备工作
现在服务器已经能正常访问了,展示给用户的界面是index.html中的内容,那么如何启动用户利用cgic库编写的程序呢?可以在index.html添加启用逻辑,修改index.html内容如下(记得先杀掉启用的boa进程):
<html>   
  <head>     
    <meta http-equiv="content-type" content="text/html; charset=gb2312" />     
    <title>This is a test program!</title>   
  </head>
  <body>     
    <h1>This is a test!</h1>     
    <br />     
    <br />     
    <a href="./cgi-bin/test.cgi">To cgi page!</a>    
  </body>
</html>
接下来的主要工作就是编写test.cgi程序放在/var/www/cgi-bin目录下即可,此程序编写就是cgic编程的主要工作。
test.cgi的实例源码如下:
#include<stdio.h>
int main()
{
printf("Content-type:text/html\n\n");
printf("<html><body>");
printf("<font stype=\"color:red;font-size:30px;\">Hello CGI!</font><br />");
printf("<a href=\"../index.html\">return index.html</a>");
printf("</body></html>");
return 0;
}
##cgic编程
+ 从官方网址下载了CGIC库之后,解开压缩包,里面有大约10个文件,有用的是:
cgic.h:头文件;
cgic.c:CGIC的源代码文件;
cgictest.c:CGIC库的作者提供的一个CGI程序例子;
capture.c:用于调试CGI程序的工具;
Makefile:安装CGIC的脚本文件;
可以看到,整个库实际上就是cgic.c一个文件,可以说是非常的精炼。


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


cgiHeaderContentType("text/html");这个语句的调用一定要在所有printf语句之前。这个语句告诉浏览器,这次传来的数据是什么类型。



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页