`
telyy123
  • 浏览: 13053 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
最近访客 更多访客>>
社区版块
存档分类
最新评论

用C语言进行CGI程序设计

阅读更多

     进公司不就,刚完成了公司交给的第一个跟嵌入式有关系的产品开发工作。本人Java Web出身,具有传奇的求职经验(不为吹嘘,请大家不要为这句话纠缠不清),竟然稀里糊涂的就从一个做Java Web的,华丽的转身成为一个做跟我梦寐以求的嵌入式的人!废话太多不好,先总结一下这个产品开发中遇到的问题,供以后参考。
     公司是一个转型公司,最近几年才开始注重研发的。公司里面除了我是Java Web出身,其他技术研发的都是C的,刚进来鸭梨比较大,虽然自己有一定的C和C++基础。
     刚进来就是对公司产品的熟悉,读了一下源码(linux下,基本上都是C),感觉比较吃力,没过多久,老大就让我对公司一个产品的配置界面的进行改造,这个是需要直接放进flash中的,工程容量的最大允许量1M!由于刚开始没有进行深入的研究,一直秉承着做java web的思维,认为工程大小无所谓,反正是放在电脑上的,硬盘不够就扩容就行了。但是后来发现,嵌入式的产品对这个很敏感,在作设计的时候就应该考虑如何去给程序瘦身,如何去提高代码质量。
     花了差不多2个月的时间,将产品的改造初步完成,接下来就是一些很小的修修补补的事了,老大把剩下的事交给了一直跟我协作的那个人,让我开始投入到公司PBX相关的研究与开发中。
     公司PBX的东西,属于核心产品,我要做的第一件事就是将原有的配置界面的风格跟之前做的一个产品进行统一,(cgi(linux下c实现) + jquery)。又一次被打击:linux下开发,不停的vi,还有不得不去了解熟悉的lighttpd和cgi(c实现)的通信原理和深层次应用。之前大致对这个产品进行了分心,估计是要经历一次很痛苦的开发。。。
     不过,作IT的,注定了需要不断去学习。下面将我对cgi的一些了解写下来,欢迎同行们能拍砖。

      [color=olive]一,CGI概述

     CGI(公共网关接口)规定了Web服务器调用其他可执行程序(CGI)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互,也就是CGI程序接收Web浏览器发送给Web服务器的信息进行处理,将相应结果送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单数据的处理,数据库查询和实现与传统应用系统的集成等工作。CGI程序可以用任何程序设计语言编写,如shell、Perl、Fortran、Pascal、C等。但是用C语言编写的CGI程序具有执行快、安全性高(因为C语言程序是编译执行且不可被修改)等特点。
    
     CGI接口标准包括标准输入、环境变量、标准输出三部分。
     1. 标准输入
    
     CGI程序像其他可执行程序一样,可通过标准输入(stdin)从Web服务器得到输入信息,如Form中的数据,这就是萎缩的向CGI程序传递数据的POST方法。这意味着在操作系统命令行状态可执行CGI程序,并对CGI程序进行调试。(从开始接触嵌入式开始,你就该适应频繁跟操作系统,特别是unix和linux这样的东西打交道的环境)。POST方法是常用的方法,下面我将以此方法为例,分析CGI程序设计的方法、过程和技巧。
     
     2. 环境变量

     操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过环境变量QUERY-STRING向CGI程序传递Form中的数据。
    
     3. 标准输出
    
     CGI程序的标准输出(stdout)将输出信息传送给Web服务器。传送给Web服务器的信息可以用各种格式,通常以纯文本或者html文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。

     下面是一个简单的C实现的CGI程序,它将html中form的信息直接输出到Web浏览器。
     
    
     #include <stdin.h>
     #include <stdlib.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);
     }

    
     下面对程序作以下简要的分析。
     printf("Contenttype:text/plain\n\n");
     此行通过标准输出将字符串Contenttype:text/plain\n\n传送给Web服务器。它是一个MINE头信息,它告诉Web服务器随后的输出是以纯ASCII文本的形式。注意:这个头信息中有两个换行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。
     if(getenv("CONTENT-LENGTH")) n = atoi(getenv("CONTENT-LENGTH"));
     此行首先检查CONTENT-LENGTH环境变量是否存在。Web服务器在调用使用POST方法的CGI程序时设置此环境变量,它的文本值表示Web服务器传送给CGI程序的输入中的字符数目,因此使用atoi()函数将此环境变量的值转换成整数,并赋值给n。请注意,Web服务器并不以文件结束符来终止它的输出,所以如果不检查环境变量CONTENT-LENGTH,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服务器。

     二,环境变量
   
     环境变量是文本串(名字/值对),可以别OS Shell或者其他程序设置,也可以被其他程序访问。它们是Web服务器传递数据给CGI程序的简单手段,之所以称为环境变量是因为它们是全局变量,任何程序都可以存取它们。
 
     下面是CGI程序设计中经常要用到的一些环境变量:
     HTTP-REFERER:调用该CGI程序的网页的URL
     REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名
     REQUEST-METHOD:当Web服务器传递数据给CGI程序时所采用的方法,分为GET和POST两种。GET方法仅通过环境变量(如QUERY-STRING)传递数据给CGI程序,而POST方法通过环境变量和标准输入传递数据给CGI程序,因此POST方法可较方便的传递数据给CGI程序。
     SCRIPT—NAME:该CGI程序的名称
     QUERY-STRING:当使用POST方法时,Form中的数据最后放在QUERY-STRING中,传递给CGI程序
     CONTENT-TYPE:传递给CGI程序数据的MIME类型,通常为"application/x-www-form-url-encoded",它是html form中以POST方法传递数据给CGI程序的数据编码类型,成为URL编码类型。
     CONTENT-LENGTH: 传递给CGI程序的数据字符数(字节数)

     三,Form中输入的分析和解码

     1. 分析名字/值对

     当用户提交一个html form时,Web浏览器首先对form中的数据以名字/值对的形式进行编码,并发送给Web服务器,然后由Web服务器传递给CGI程序。其格式如下:
     name1=value1&name2=value2&name3=value3&name4=value4...
     其中名字是form中定义的input、select或textarea等tag的名字,值是用户输入或者选择的值。这种格式即为URL编码,程序中需要对其进行分析和解码。要分析这种数据流,CGI程序必须首先将数据流分解成一组组的名字/值对,这可以通过在输入流中查找下面的两个字符来完成。
     每当找到字符=,标志着一个form变量名字的结束;每当找到字符&,标志着一个form变量值的结束。清注意输入数据的最后一个变量值不以&结束。
     一旦名字/值对分解后,还必须将输入中的一些特殊字符转换成相应的ASCII字符,这些特殊字符是:
     + : 将+转换成空格符
     %xx : 用其十六进制ASCII码值表示的特殊字符。根据值xx将其转换成相应的ASCII字符。
     对form变量名和变量值都要进行这种转换。下面是一个对form数据进行分析并将结果回送给Web服务器的CGI程序。

    
     #include <stdio.h>
     #include <stdlib.h>
     #include <strings.h>

     int htoi(char *);

     main()
     {
         int i, n;
         char c;
         printf("Contenttype:text/plain\n\n");
         n = 0;
         if(getenv("CONTENT-LENGTH"))
             n = atoi("CONTENT-LENGTH");
         for(i = 0;i < n;i++)
         {
             int is-eq = 0;
             c = getchar();
             switch(c)
             {
                 case '&' : 
                   c = '\n';
                   break;
                 case '+' : 
                   c = '  ';
                   break;
                 case '%' : 
                   {
                       char s[3];
                       s[0] = getchar();
                       s[1] = getchar();
                       s[2] = 0;
                       c = htoi(s);
                       i += 2;  
                   }
                   break;
                 case '=' : 
                   c = ':';
                   is-eq = 1;
                   break;
             };
             putchar(c);
             if(is-eq)
                 putchar('  ');
         }
         putchar('\n');
         fflush(stdout);
     }
      
     /** Convert hex string to int  **/
     int htoi(char *s)
     {
         char *digits = "0123456789ABCDEF";
         if(islower(s[0])) s[0] = toupper(s[0]);
         if(islower(s[1])) s[1] = toupper(s[1]);
         return 16 * (strchar(digits,s[0]) - strchar(digits, '0')) + (strchar(digits,s[1] -  strchar(digits, '0')));
        
     }

     上面的程序首先输出一个MIME头信息给Web服务器,检查输入中的字符数,并循环检查每个字符。

     三,产生HTML输出

     CGI的输出由两部分组成:MIME头信息和实际的信息。两部分之间以一个空行分开。可以使用MIME头信息为"Contenttype:text/html\n\n"来输出html源代码给Web服务器,下面是一个简单的例子:

    
     #include <stdio.h>
     #include <string.h>
     main()
     {
         printf("Contenttype:text/html\n\n");
         printf("<html>\n");

         printf("<head><title>An HTML Page From a CGI</title></h ead>\n″");

         printf("<h2> This is an HTML page generated from with i n a CGI program..   .</h2>\n");

         printf("<hr><p>\n");

         printf("<a href="../output.html#two"><b> Go back to out put.html page <
  /b></a>\n");

         printf("</body>\n");

         printf("</html>\n");

         fflush(stdout);
     }

    
[/color]
分享到:
评论

相关推荐

    用C语言进行CGI程序设计.doc

    用C语言进行CGI程序设计.doc

    如何用C语言进行CGI程序设计?.doc

    C语言进行CGI程序设计 ,非常好的资料,由KLC搜集整理,不敢独享,大家都来下载吧

    用C语言技术进行CGI程序设计

    用C语言技术进行CGI程序设计用C语言技术进行CGI程序设计

    用c语言进行cgi程序设计.rar_CGI程序设计_cgi_cgi c语言

    源代码和说明都包含在一个txt文件里面.有关cgi的说明和一个可以执行的源程序都在里面.

    CGI程序设计指南.rar

    CGI程序设计指南通用网关接口(CGI)程序主要用来实现Web服务器、浏览器和外部服务程序间的交互。对用户而言,它提供了双向交互能力,使得Internet漫游更加有趣和人性化。 本书共分十二章,从比较直观的角度出发,...

    嵌入式Linux下基于CGI的文件上传下载的实现

    讨论了在嵌入式Linux系统下,采用ACME的thttpd作Web服务器,用C语言进行CGI程序设计的原理和方法。应用此方法并以文件的上传和下载为例给出了具体实现,用POST方法实现了文件上传,用GET方法实现了文件下载。测试...

    unix平台下c语言高级编程指南

    9.1 CGI程序的基本概念 9.2 CGI基本编程 9.3 使用脚本语言编写CGl 9.4 Perl语言简介 9.5 一个简单的CGI例子 第三部分 X Window应用程序开发 第10章 X Window和Motif基础 10.1 简介 10.2 XWindow基本概念 ...

    &nbsp;基于CGI的无线路由中短信功能设计

    &nbsp;移动通信中的短消息是人们无线沟通的重要方式,更以其方便、可靠性得到广泛...用C语言进行CGI程序设计,采用PDU短信模式,实现无线路由设备中短信的收发。实验结果也证实了此方案的正确性、实用性和可扩展性。

    Web应用安全:使用Perl的对策进行HTML转义的方法.pptx

    使用Perl对策进行HTML转义 1 Perl 2 Perl转义对策 3 Perl对策转义XSS实例演示 ...CGI 是外部应用程序( CGI程序 )与 WEB 服务器之间的接口标准,是在 CGI 程序和 Web 服务器之间传递信息的过程。 CGI 规范允

    Linux 通用 WebAdmin (webui) 开发框架-C语言 源码

    WebAdmin是一个用C语言设计的易用的图形用户接口开发框架,C语言的高可移植性使得WebAdmin可以广泛应用于包括Linux、Unix、Windows及各种嵌入式操作系统中,编译WebAdmin系统除Libxml2库处不需要额外的C函数库支持...

    PHP和MySQL.Web开发(第5版)PDF书-英文+源代码

    语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的...

    毕业论文.NET网络聊天室的规划和设计

    WebChat则采用浏览器方式,实际上是一个多人共同使用的CGI程序。其基本原理是把每个用户的发言通过浏览器传给系统,再由系统收集处理后分发给特定用户。 下面所做的是一个利用ASP.NET技术、数据库技术、#C语言、ADO...

    Tcl_TK编程权威指南pdf

    他使用Tcl作为这两种工具的命令语言,这样用户就可以定义菜单或者对那些程序进行定制。那时还处在使用X10的时代,他计划编写一个基于Tcl的X工具包,以使程序之间通过Tcl命令进行通信,彼此相互协作。对我来说,这种...

    Net-skyChatServer类似网易聊天室

    Net-Sky ChatServer不同于其他的用PHP,ASP,PERL等脚本语言编写的或其他任何CGI模式的聊天程式,本聊天室程序使用标准C语言开发,独立于任何第三方WEBSERVER而运行,快速,高效,稳定,大容量。程序的设计目标是能...

    Python基础教程(第2版.修订版)

    修订版)包括Python程序设计的方方面面,首先从Python的安装开始,随后介绍了Python的基础知识和基本概念,包括列表、元组、字符串、字典以及各种语句。然后循序渐进地介绍了一些相对高级的主题,包括抽象、异常、...

    MySQL5 权威指南第3版中文版_part1

     19.3 ADO程序设计与Visual Basic 6/VBA  19.4 与MySQL服务器建立连接  19.5 转换器:从Microsoft SQL Server到MySQL  19.6 VBMySQLDirect  第20章 Visual Basic .NET和C#  20.1 ADO .NET与MySQL之间的通信  ...

    MySQL 5权威指南(第3版) 中文版 下载地址

    内容提要 -----------------------------...他写了很多非常成功的计算机图书,内容涉及Visual Basic、Linux、Mathematica和Maple等多种程序设计语言和软件。Kofle还是Definitive Guide to Excel VBA第2版的作者。

Global site tag (gtag.js) - Google Analytics