首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于CGI的嵌入式web server设计

基于CGI的嵌入式web server设计

一、CGI概述

  CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程 序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的
交互,也就是CGI程序接受Web浏览器发送给 Web服务器的信息,进行处
理,将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成We b网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统
的集成等工作。CGI程序可以用任何程序设计语言编写,如Shell脚本
语言、Perl、Fortran、Pascal、C语言等。但是用C语言编写的CGI程
序具有执行速度快、安全性高(因为C语言程序是编译执行且不可被修 改)等特点。



  CGI接口标准包括标准输入、环境变量、标准输出三部分。



  1.标准输入



  CGI程序像其他可执行程序一样,可通过标准输入(stdin)从Web服 务器得到输入信息,如Form中的数据,这就是所谓的向CGI程序传递数
据的POST方法。这意味着在操作系统命令行状态可执行CGI程序,对CG I程序进行调试。POST方法是常用的方法,本文将以此方法为例,分析C
GI程序设计的方法、过程和技巧。



  2.环境变量



  操作系统提供了许多环境变量,它们定义了程序的执行环境,应用 程序可以存取它们。W eb服务器和CGI接口又另外设置了自己的一些
环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过 环境变量QUERY-STRING向CGI程序传递Form中的数据。



  3.标准输出



  CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。传 送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本
的形式,这样我们就可以在命令行状态调试C GI程序,并且得到它们的 输出。







  下面是一个简单的CGI程序,它将HTML中Form的信息直接输出到We b浏览器。

  #include <stdio.h>


  #include <stdib.h>


  main()


  {


   int,i,n;


  printf (″Contenttype:text/plain\n\n″);


  n=0;


  if(getenv(″CONTENT-LENGTH″))


  n=atoi(getenv(CONTENT-LENGTH″));


  for (i=0;i<n;i++)


  putchar(getchar());


  putchar (′\n′);


  fflush(stdout);


  }





  下面对此程序作一下简要的分析。


  prinft (″Contenttype:text/plain\n\n″);


  此行通过标准输出将字符串″Contenttype:text/plain\n\n″传
送给Web服务器。它是一个MIME头信息,它告诉Web服务器随后的输出 是以纯ASCII文本的形式。请注意在这个头信息中有两个新行符,这是
因为Web服务器需要在实际的文本信息开始之前先看见一个空行。


  if (getenv(″CONTENT-LENGTH″))


  n=atoi (getenv(″CONTENT-LENGTH″));


  此行首先检查环境变量CONTENT-LENGTH是否存在。Web服务器在
调用使用POST方法的CGI程序时设置此环境变量,它的文本值表示Web 服务器传送给CGI程序的输入中的字符数目,因此我们使用函数atoi()
将此环境变量的值转换成整数,并赋给变量n。请注意Web服务器并不 以文件结束符来终止它的输出,所以如果不检查环境变量CONTENT-LEN
GTH,CGI程序就无法知道什么时候输入结束了。








  for (i=0;i<n;i++)


  putchar(getchar());


  此行从0循环到(CONTENT-LENGTH-1)次将标准输入中读到的每一
个字符直接拷贝到标准输出,也就是将所有的输入以ASCII的形式回送 给Web服务器。

  通过此例,我们可将CGI程序的一般工作过程总结为如下几点。


  1.通过检查环境变量CONTENT-LENGTH,确定有多少输入;


  2.循环使用getchar()或者其他文件读函数得到所有的输入;


  3.以相应的方法处理输入;


  4.通过″Contenttype:″头信息,将输出信息的格式告诉Web服务 器;


  5.通过使用printf()或者putchar()或者其他的文件写函数,将输 出传送给Web服务器。


  总之,CGI程序的主要任务就是从Web服务器得到输入信息,进行处 理,然后将输出结果再送回给Web服务器。



  二、环境变量



  环境变量是文本串(名字/值对),可以被OS Shell或其他程序设置 ,也可以被其他程序访问。它们是Web服务器传递数据给CGI程序的简
单手段,之所以称为环境变量是因为它们是全局变量,任何程序都可以 存取它们。



  下面是CGI程序设计中常常要用到的一些环境变量。


  HTTP-REFERER:调用该CGI程序的网页的URL。


  REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名。


  REQUEST-METHOD:指的是当Web服务器传递数据给CGI程序时所采 用的方法,分为GET和PO
ST两种方法。GET方法仅通过环境变量(如QUE RY-STRING)传递数据给CGI程序,而POST方法通过环境变量和标准输入
传递数据给CGI程序,因此POST方法可较方便地传递较多的数据给CGI 程序。






  SCRIPT-NAME:该CGI程序的名称。


  QUERY-STRING:当使用POST方法时,Form中的数据最后放在QUERY- STRING中,传递给CGI程序。


  CONTENT-TYPE:传递给CGI程序数据的MIME类型,通常为″applica tion/x-www-form-url
encodede″,它是从HTML Form中以POST方法传 递数据给CGI程序的数据编码类型,称为URL编码类型。


  CONTENT-LENGTH:传递给CGI程序的数据字符数(字节数)。


  在C语言程序中,要访向环境变量,可使用getenv()库函数。例如:


  if (getenv (″CONTENT-LENGTH″))


   n=atoi(getenv (″CONTENT-LENGTH″));


  请注意程序中最好调用两次getenv():第一次检查是否存在该环 境变量,第二次再使用该环境变量。这是因为函数getenv()在给定的
环境变量名不存在时,返回一个NULL(空)指针,如果你不首先检查而直 接引用它,当该环境变量不存在时会引起CGI程序崩溃。
继承事业,薪火相传
返回列表