Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > eyBuild中文手册(CGI)
【标  题】:eyBuild中文手册(CGI)
【关键字】:eyBuild,CGI
【来  源】:http://blog.csdn.net/yinchongyi/archive/2006/11/15/1385992.aspx

eyBuild中文手册(CGI)

Your Ad Here  
感谢作者newzy
 
访问eyBuild的网站 http://www.eybuild.com
或发送email到: eybuild@hotmail.com, newzy@eybuild.com, xxt@eybuild.com
在线支持Skype: newzyx86 MSN: eybuild@hotmail.com QQ: 178565448     
第1章  序言
VB/JAVA/PHP等脚本直接嵌入在HTML中叫 ASP/JSP/PHP,那么用 C 直接嵌入在HTML中叫 CSP 吗?
是的, 现在我们可以直接将 C 语句嵌入在HTML中并叫它 CSP。C 语言天然好的"移植性/高效性/灵活性",一直以来都是最受程序员青睐的语言。现在用CSP 技术我们就可以轻松地将 C 语句直接嵌入到 HTML 源文件来快速编写CGI程序。
一般工作步骤:
编辑好的 CSP 源程序,用eyBuild开发包提供的 CSP2BIN 工具将 CSP 源文件生成 C 程序的源文件,再链接上 eyBuild 提供的高效 CGI 运行库,就可以在各种平台生成移植性非常高的 CGI 程序。
CSP VS cgilib:
传统的cgilib的直接使用标准函数printf等语句输出HTML代码。不但使得C程序和HTML程序交织的混乱不堪,还使得页面输出的流程控制变得异常复杂。现在ASP/JPS/PHP等几乎完全取代用cgilib。CSP与cgilib的开发模式不同,它充分吸取了ASP/JSP/PHP等以HTML/XML为模板嵌入脚本等诸多优点,并充分融合C语言的语言特性。使得CSP的开发变得快速、高效,并大大提了最终代码的可读性和维护性。CSP及其开发环境eyBuild是cgilib的继承和发展,同时目前也是开发高效率WEB应用的最佳选择。
FastCGI 组件:
众所周知,FastCGI程序比CGI程序响应速度高3至5倍。eyBuild提供的编译选项HAVE_FASTCGI,可以使原有的CGI源程序在不作任何修改的情况下作为FastCGI程序使用,这使得编写FastCGI程序更容易。同时,eyBuild提供样板程序,可以在编译FastCGI和CGI程序之间切换更容易,调试更方便。
To ASP/JSP/PHP 的程序员:
编写 CSP 程序就跟编写 ASP/JSP/PHP 一样,可以以先编写 HTML 文件为模板, 再在其中插入CSP 的语句。 甚至有些时候,就可以直接拿 ASP/JSP/PHP 的源文件稍加修改后作为 CSP 的源文件了,因为它们都用类似 <% 和 %> 的标签进行标记的嘛。 如果你是 ASP/JSP/PHP的程序员,并熟悉 C语言,半天时间你就能把 CSP 全学会。
To 嵌入式WEB开发:
CSP 设计的最原始的初衷,就是要为嵌入式开发定制的一套类似 ASP/JSP/PHP的C语言开发工具。 因为嵌入式设备(如路由器/交换机/VoIP网关PBX等)上用的开发语言主要是 C,而传统的 CGI 库 cgilib 以及开发模式远远不能跟上现代的开发需求。
现在 CSP 的eybuild开发环境提供的PC和嵌入式设备上高效移植的开发库,让服务器上应用和嵌入开发进行了有效统一,使得两者上的开发变得更为容易。 同时,优秀的跨平台的移植性也是eybuild的重要特性。
实践证明,CSP 及其开发工具 eybuild是嵌入式设备WEB开发的最理想工具,它能大大节缩短发周期(一般提高4-6倍),提高最终代码的可读性、可维护性(HTML 和 C 代码进行了有效的分离,所以代码维护更容易)。
高效的页面/图片/CSS集成技术:
通过eyBuild提供的集成技术,你可以把许多CSP/HTML页面集成生成到一个CGI中(包括页面相关的图片,CSS 文件及其它静态文件)。 甚至,你可以将一个小型的网站或WEB应用生成到一个CGI文件中,这使得最终的可执行脚本文件管理变得异常简单。 这一点在嵌入式设备上特别有用,因为它们中的很多只有有限的外存储器(如Flash ROM)和文件系统。 eyBuild为最后生成的 CGI 程序在其内部建立了虚拟目录,使得页面间的链接和引用跟一般HTML的编写方法一样,非常方便建立和维护。同时对服务器级应用,这也将是一个非常有利的选择。
可以直接调用任意 C 的函数
在 CSP 源程序中还可以非常容易地包含C 程序的头文件,这样在 HTML 代码中你就可以像写编写 C 文件一样调用外部函数或系统函数了,跟直接编辑 C 程序几乎没有差别。
CSP 的宏指令指示符 @
用宏指令指示符不仅可以进行包含 C 程序的头文件,还可以包含其它CSP文件。 这样当许多页面需要引用共通的一部分时(如页头/页脚或其它部分),包含其它 CSP 源文件这个功能显示特别有用。
有效的页面输出缓冲控制
跟 ASP/JSP/PHP一样,通过宏指令指示符还可以有效控制页面输出时的 MIME 头,页面缓冲区大小等等。这种使得页面上的流程控制变得更简单更直观。

第2章  什么是eyBuild
eyBuild,是 Easy Build 的简写,它是CSP(C Language Service Page)开发套件的总称。eyBuild是嵌入式设备上WEB应用的最理想的开发工具,同是也是服务器WEB应用开发最有益的补充,它主要包括CSP2BIN、WEB2BIN、DONEMAP、eyBuildLib等开发组件。
CSP是C Language Service Page 的缩写,它是一种基于C语言的脚本开发技术。跟ASP、JSP类似,它们都是CGI(Common Gateway Interface)的一种变种。我们可以直接将C语句插入到HTML/XML等模板文件中来编写CSP的源文件,用CSP2BIN将该文件转换成C语言的源程序。
2.1  CSP与CGI
自CGI产生以来,C语言以其高效性、灵活性和通用性一直是开发交互式WEB应用的最有吸引力的选择。但近年来,能直接内嵌于HTML文档中间的各种脚本工具,以其简便性易用性使一部分用户开始放弃了直接用C来开发CGI脚本。
但还有两类用户没有放弃用C来开发它们的应用,一是对性能追求较高的高端开发者,二是嵌入式设备的开者。前者选择C语言来开发它们的WEB应用,是因为C高效性、灵活性和通用性是各种脚本工具无法取代的。后者选择C语言,是因嵌入式设备的特点(内存、CPU等资源有限等,不可在设备上运行如ASP,PHP,PERL等的脚本的运行环境)决定的(另外,目前嵌入式设备主要以C语言开发为主)。
自CGI出现以来,就有人开发方便C语言开发的开发库cgilib,从目前的情况看cgilib并没有得到广泛的应用;反观下各种脚本开发工具,它们则受到WEB开发者的直接异常青睐。对比后不难发现,基于C语言的cgilib并没有从根本上解决交互式WEB应用的真正需求,这是因为直接用C语言无法像其它脚本一样嵌入在HTML文档中间,使得用输出HTML文档时非常烦琐,源代码可读性较差,维护困难。
 
现在用CSP来开发WEB应用程序则与之不同,我们可以像ASP、JSP、PHP等工具一样直接将脚本语言(这里指C语言)的语句嵌入到HTML/XML等模板文件中。因为在源文件中用<% %>标记分隔,使得C程序和HTML/XML代码程序进行了有效的分离,同时也使得代码的可读性、可维护性大大增强,开发周期大大缩短。
如果你是个C/C++或JAVA程序员,你不必重新学习任何一种新语言,即可以像高效地开发WEB应用,工作模式跟原来几乎一样。如果曾经用ASP、JSP、JSP开发过并有一定的C语言基础,你会发现CSP简单就是它们的一种变种。无需太多学习即可用CSP做开发了。
 
下面是一段简单的CSP代码(头文件包含不是必须的,仅用作示范),它是将一段C程序直接嵌套在HTML模板文件中:
 
1
<html>
 
2
<body>
 
3
<%
语句起始标签
4
@ include <stdio.h>
C 语言头文件包含
5
@ include <my_header.h>
C 语言头文件包含
6
%>
语句结束标签
7
输出:<% = “hello world<BR>” %>
输出字符串
8
也可以这样输出:
 
9
<%
 
10
$print (“%s<BR>”, “*** hello world ***”);
C 语句
11
%>
 
12
</body>
 
13
</html>
 
 
 
2.2  为什么要选择eyBuild开发Web站点
eyBuild 是基于CSP技术的开发套件的总称,它具有如下特点:
1.      嵌入式设备WEB应用开发的最佳选择
目前嵌入式设备上的WEB应用最主要还是C语言直接开发CGI程序。除在序言中提到了直接用C开发CGI的诸多缺点外,直接将HTML代码用C语句输出,不能对两都进行有效的分离,将大大降低HTML源程序和C源程序的可读性、维护性;直接用C语言开发还必须手工对页面输出的流程进行控制,还将大大降低了开发的效率。
eyBuild提供的CSP翻译工具,将CSP源程序翻译成C语言源程序。开发都只要编辑好HTML页面模板,然后在适当地方嵌入C语句即可以有效控制页面的输出;上文提到,还可以通过指示指令对输出页面的进行控制。使得WEB界面的开发和执行控制动作进行了有效的分离。使得嵌入式设备的WEB开发变得高效、有序。
2.      服务器WEB应用开发工具的最有益补充
用eyBuild开发的WEB应用程序可与任意服务器WEB应用进行有效的接合,因为eyBuild开发的WEB应用程序是一个独立的自治单元,它不依赖于WEB Serever或其它脚本程序。所以你可以在其它任意脚本程序中通过URL发起eyBuild开发程序。eyBuild最终会将源文件生成C代码,它生成的应用具有极高的执行效率。这样,你就可以用eyBuild来开发所需要的脚本组件,以解决效率的瓶颈。
3.      通用、高效、跨平台性
这是因为:(1)eyBuild会将CSP源文件及其它非程序文件翻译成C语言的源程序,所以CSP天然地继承了C语言的一切特性。(2)eyBuild库的实现是完全遵循CGI1.1标准,所以你可以在任意操作系统(支持:Windows、Linux、BSD Unix、Free BSD、Sun Solaris、VxWorks、WinCE、uC/OS-II)上任意遵循CGI1.1标准的WEB服务器(支持Apache,IIS,GoAhead,httpd,mini-httpd ……)下运行最终的CGI程序。
4.      规则简单,易学易用
简单的说CSP就是直接C语句嵌入到HTML页面中,用C语言来响应请求、控制页面的动态输出行为,并通过简单的指令来控制页面的流程。用翻译器将CSP源文件翻译成C程序的文件。eyBuild还提供了MAP工具,通过它可以非常容易将CSP源程序和其它非程序文件(如图片、静态HTML文件、CSS文件)集成。
5.      用FastCGI使最终程序执行更高效
众所周知,CGI 程序效率的瓶颈在于每次发起一个新的进程处理请求,而FastCGI 则通过后台守护进程等方式使得处理效率能提高4~5 倍。eyBuild提供的HAVE_FASTCGI组件,使CGI源程序在不作任何修改的情况下即可转化为FastCGI程序,FastCGI程序开发更简单。
6.      模板选择有更大的灵活性
很幸运,你几乎可以以任意文本文件(如HTML、XML、JS、CSS、TXT)为模板,在其中插入CSP语句。这一点与其它解释性脚本语言大不相同,这是因为CSP2BIN仅从中卒取CSP语句解析翻译,而视其它的数据为普通文本。这一特性,给CSP模板的选择大大增加了灵活性。
7.      上传文件更容易
eyBuild专为大量数据传送(如提供一般表单项同时上传文件,见“CSP中获取输入”)提供了一个API接口。使得多个文件上传,以及上传到服务器后的文件管理更加简单。同时还为特殊应用提供了场合提供了HOOKS接口。
8.      eyBuild提供了高效的运行库
eyBuild为不同操作系统平台提供了高效的运行库,可以直接在CSP中的C语句直接调用也可以在独立的C文件中调用。eyBuild运行库类似于cgilib,如获取用户输入参数、进行页面输出缓冲、处理文件上传)。
9.      使得脚本程序管理更简单
eyBuild提供了模块化处理功能,即将许多相关的CGI处理页面及相关文件(如:图片、CSS、.js文件)生成到一个cgi执行文件中,并为每个处理页面或文件在cgi执行文件内部提供虚路径的映射。这样,每个最终生成的cgi文件就一个具有相关页面集合的功能单。甚至将整个站点生成在一个cgi文件中,或者作为一个独立的模块集成到其它应用程序中。这一点在站点的发布和维护有用上非常有用,应用实例见后文。
10. 源程序安全保密
因为最终会将所有的CSP源文件生成C文件并最终编译成在一个二进制文件,而不像其它脚本程序一样由脚本解释器解释脚本源程序执行,所以并不存在源代码安全隐患。对源代码具有很好的保密性。
 

第3章  CSP的语法
在CSP源文件中界于<%和%>之间的语句(可以跨越多行)都被称为CSP语句,CSP翻译工具CSP2BIN将对<%和%>之间CSP语句进行解释。在CSP语句的任意字符都将被视为HTML源程序的语句,CSP2BIN工具一般不对其进行解析。
3.1  CSP的语句
CSP语句包括单行语句和多行语句。凡<%和%>出现在同一个自然行的CSP语句称为单行语句;凡<%和%>跨越两个或两个以上的自然行的CSP语句称为多行语句。如下所示:
 
单行语句输出的例子:
1
单行语句输出:<% = “hello world<BR>” %>再输出一次<% = “hello world<BR>” %>
 
多行语句输出的例子:
1
<%
2
= “这是第二行<BR>”
3
= “这是第三行<BR>”
4
%>
3.2  语句格式
CSP语句以行为解析单位,每一行作为一个独立的语句CSP语句行的格式如下:
CSP语句总是以上边界符“<%”为开始,以下边界符“%>”为结束。CSP语句内部每一个自然行为一个CSP语句行。CSP翻译器以CSP语句行为单位对CSP语句进行解析。每一个语句行由三部分组成:前缀符、语句体、分号。如下所示:
 
 
1
<%
[前缀符]
[语句体1]
[;]
 
 
2
 
[前缀符]
[语句体2]
[;]
 
 
3
 
[前缀符]
[语句体3]
[;]
%>
 
 
CSP 语句行中的三部分全部省略时,称为空语句。空语句用于书写时的格式控制,翻译时翻译器将跳过空语句行。
3.3  CSP的语句行宏定义前缀符
宏定义前缀符是在CSP源文件被翻译成C程序源程序时处理,它主要用于简单页面处理的工作流程,目前eyBuild的CSP语句行包括如下宏定义前缀符:
前缀符
//
注释,// 后的内容不作任何解释
@
指令指示符,用于对CSP进行特殊控制,如包含头文件、包含其它CSP页面
$
调用页面内建函数,如$echo, $print (两者功能相同)
=
字符串输出,计算 = 后面的函数、变量或常量的值并作为字符串进行输出
=$
数字输出,计算 = 后面的函数、变量或常量的值并作为十进制数字进行输出
=%
自定义格式输出,
%
保留,未定义
?
保留,未定义
备注:
其它可打印字符视为C语句的一部分,不作为前缀符解释,如&, !, ~
 
说明:
1. 当CSP语句行包含前缀符时,行末的分号不是必须的,翻译器会根据需要为最终果添加必要的C语句结束符——分号(;)。
2. 当CSP语句行有前缀符时,翻译器会将其作为C 语言的语句直接输出,且会自动在语句最后为其加上分号。
3. 类似于ASP、JSP等,CSP也可以用等进行语句输出,等号后面可以是一个常量、变量或一个函数,但是值(如函数返回的值)必须是一个字符串;当输出数据时可使用前缀符 “=$”,相当于printf格式化字符中的“%d”;同时,可用“=%”输出任意指定格式的数据类型。
4. 在CSP语句行中插入C语句时,注意行首字符不要跟CSP的前缀符冲突(如将所有运符写在行尾等方法)。一般地,按K&R著的The C Programming Language的C程序风格式,一般就不会与CSP语法冲突
 
例1:加与不加分号:
 
1
<% @ include <my_header.h>
语句最后不必加分号
2
 $print(“xx”, “yyy”); 
语句最后不必加分号
3
 $echo(“xx”, “yyy”); 
. .
4
 my_func (
语句最后不能加分号
5
           parameter1,
. .
6
           parameter2,
. .
7
           parameter3
. .
8
           );
必须手工加上分号
9
%>
 
 
例2:用 = 进行输出:
 
1
<% {
 
2
char * pstr = “this is a test<BR>”;
定义一个C变量
3
= "Build Date:" __DATE__ __TIME__ "<BR>"
输出常
4
= pstr
输出变量
5
= cgiPrefix()
输出函数返回的字符串
6
=$ (123+456)
输出数值
7
=%x, 128
输出按16进制输出 128
8
} %>
 
 
 
3.4  CSP的注释前缀符(//
如果CSP语句行以前缀符“//”为开头,那么该行将被作为注释处理,即忽略#后面的任何内容。当然,也可以直接用C的注释:“/* xxx */”。它们的区别是,翻译器会将C/C++的注释语句写入目录C程序中去,而“//”则注释语句则不会。注释行的语句体格式如下:
 
//
任意内容
 
例1:CSP 的注释和C的注释
 
1
<%
 
2
// This is CSP comment
CSP 注释
3
var++; /* this is C/C++ comment */
C 语句 + 注释
4
%>
 
 
 
3.5  CSP的指令前缀符(@
包含前缀符“@”的语句行,被称为指令行。指令语句可以写在CSP源文件的任意处,因为它总是在翻译阶段被处理。指令行的语句体格式如下:
 
指令
分隔符
["]
指令的值1
["]
[, {指令的值2}]
 
1. CSP的指令定义及其意义如下:
 
设置页面缓冲区的大小,默认为4K
autoflush
是否允许自动 Flush 缓冲区,默认为TRUE
mimeheader
设置页面的MIMI
require
指令所在处语句处插入另外一个页面
include
C 语言的文件包含语句,相当于 #include
2. 分隔符可以为:空格、TAB或等号,等号两边的空格或TAB将被忽略
3. 指令值两边的双引号是可选的,即可以输入也可以不输入,但必须成对出现。
 
例1:指令分隔符
 
1
<%
 
2
@pagesize = 4K
= 作分隔
3
@pagesize 4K
用空格或TAB分隔
4
%>
 
 
例2:指令两边的分号
 
1
<%
 
2
@ autoflush = “TRUE”
加上引号
3
@ autoflush = FALSE
不加引号
4
%>
 
 
例3:其它例子:
 
1
<%
 
2
@mimeheader = “Content-Type=html/text\n”
MIME 第一句
3
@mimeheader = “Cache-Control: no-cache\n\n”
将连在上一句后面
4
@include “myheader.h”
包含头文件
5
@include <myheader.h>
包含头文件
6
%>
 
  
 
3.6  CSP的require指令
require指令用于在请求处插入另外一个页面。在翻译时仅是做了一个标记,并不把请求的文件原样复制到请求处。脚本程序执行时,会根据标记将请求页面的执行结果插入到请求处。被请求页面与请求页面共用一个请求页面的缓冲区,必要时可以通过pagesize指令设置请求页面的缓冲区大小。另外,require 的最大引用深度为6级。
require 指令可以包含最多两个参数,参数间用逗号分隔。第一个参数用于指明被请求页面的虚路径,第二个参数用于向被请求页面传递参数。参数的类型被定义为 void * __handle,所以可以被请求页面中使用 __handle 来获取传入的参数。
需要特别说明的是,require只能引用当前模块(即同一CGI脚本程序)中的已存在的页面,否则C连接器会报告找不到所需要的函数错误。
 
 
例1:用require其它CSP引用页面
 
1
Hello world. This is an English Version
文件:/demo/body_en.csp
2
<Add any thing here>
 
 
1
你好,这是一个中文版
文件:/demo/body_ch.csp
2
<添加其它内容>
 
 
 
1
<html><body>
文件:/demo/main.csp
2
<%
 
3
if (!strcmp(“English”, getParameter(“version”))
获取版本类型
4
       @require “/demo/body_en.csp”;
引用英文版的内容
5
    else
 
6
@require “/demo/body_ch.csp”;
引用中文版的内容
7
%>
 
8
</body></html>
 
 
 
例2:引用其它页面,带参数: