Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8701033
  • 博文数量: 1413
  • 博客积分: 11128
  • 博客等级: 上将
  • 技术积分: 14685
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-13 10:03
个人简介

follow my heart...

文章分类

全部博文(1413)

文章存档

2013年(1)

2012年(5)

2011年(45)

2010年(176)

2009年(148)

2008年(190)

2007年(293)

2006年(555)

分类: C/C++

2006-09-21 12:14:53

[点评:听起来很不错的样子,不过好像还没有实际应用在现实的技术当中.]
这个CSP不是CSP (Commercial Service Provider)即商业服务提供商,CSP不是Cserver/Client Program,也不是China Super Programer,更不是CS Player,那么什么是CSP呢?在说明什么是CSP之前,先说明什么是“骇人听闻”,一说到“骇人听闻”,你可能就想到了是什么坏事吧,其实不一定, 应该说就是前所未闻的事说严重一点就是“骇人听闻”了。在每一本关于asp,php,jsp,asp.net书上都告诉你,做网站不可能使用C++,真的 吗?这个CSP偏偏就是C++ Server Page的简称,和asp、jsp类似,属于一种Web应用扩充的脚本语言,可以用来编写网页代码。其对应的文件名是".csp"。

(下面的文字部分来源于《CSP开发者手册》)

CSP 使用C++语言作为脚本的语言,和asp、jsp、php等不同的是,CSP不是解释执行的脚本,而是真正编译后执行的脚本。因此和其它脚本语言相比较, CSP执行速度和效率都要高一些,由于使用标准的动态连接思想,因此CSP可以被用户非常方便的扩充,对于复杂的或者保密要求高的应用,完全可以通过 CSP扩展来完全隐藏实现的细节。
CSP是经过编译执行的代码,用户需要作的是维护CSP的源码,而编译过程是由CSP内置的编译器来完成,称为 现场编译(Field Compile)。CSP脚本的缺点是需要保存编译后的二进制代码,以提高再次执行的速度,因此CSP作的网站需要比其它脚本语言占用更多的磁盘空间。
CSP实际上就是一种CGISpawn,关于CGISpawn的详细介绍可以参考MSDN的相关内容。

CSP的原理

CSP 使用了Web Service的CGI(Common Gateway Interface)接口作为通讯接口的,CSP.exe是一个标准的CGI程序,当页面接收到一个CSP的Http请求时, Web Service将会创建一个CSP.exe的进程,并且会将该Http请求传给CSP.exe进程处理,CSP.exe根据脚本的名称找到对应的csp文 件,调用csp环境提供的编译器将csp脚本文件编译为二进制的动态连接库格式,该动态连接库可以被CSP.exe进程调用执行,当Web Service再次收到同样的请求时,如果该csp文件已经被成功编译,并且在编译以后原csp脚本文件没有被修改过,则CSP.exe直接调用编译后的 动态连接库。该动态连接库执行的结果通过CSP.exe的CGI接口提交给Web Service,由此完成一个csp请求的处理过程。
CSP.exe是一个体积非常小的控制台程序,只负责完成CGI接口功能,CSP的基本支持库都被封装在一个独立的动态连接库中,因此CSP.exe进程的创建是非常快的,CSP支持库在被系统载入后可复用,因此有连续Http请求时,CSP支持库不需要从硬盘重复载入。
每一个CSP的Http请求,系统会生成一个CSP.exe的进程进行处理,因此任何csp脚本都是在独立的内存地址空间内执行的,发生的错误也不会影响到其它csp进程的执行。


CSP是如何编译的

CSP 采用的是现场编译技术(Field Compile),即在脚本被调用时才可能被编译,CSP内置的编译器是Borland BCB 5的 Free Compileor的精简集合,csp脚本只可以调用由CSP提供的函数和类库,或者是由用户扩展的支持函数和类库。
当Http请求被 CSP.exe接收时,CSP.exe则根据Web Service提供的脚本名称,将csp脚本编译成二进制文件,并且在CSP的工作目录创建和Web路径一一对应的映射路径,用于存放编译后的二进制文 件。CSP.exe接收到Http请求后,根据csp脚本和其映射路径中的二进制文件进行比较,如果版本一致,则直接调用二进制文件执行,否则,启动内置 编译器重新编译csp脚本。
编译后的二进制文件是一个标准的动态连接库,CSP.exe中提供输入和输出的接口,所有csp必须是符合这个接口标 准的动态连接库,否则不能被正确的载入,但并不是csp脚本的设计者需要仔细了解这个标准,CSP编译的预处理过程已经完成了这一标准化过程,您只需要按 照csp的特定格式开发既可。
CSP所提供的编译器是Borland C++的一个精简集合,所支持的头文件也预先经过处理,每一个csp脚本的编译过程是非常迅速的,客户端的浏览器几乎不能察觉本次调用是否进行了现场编译。


CSP的语法

Csp脚本完全符合C++语法,这和希腊Micronovae所提供的csp脚本语法不同,所有Html代码均按照C++的特定格式注解存在于文件中。以下是一个简单的CSP脚本示例:
QUOTE:
#i nclude "base.h"
HttpMain()
{
/*Http


测试的CSP脚本文档



*/
  echo "Hello World!";
/*Http


*/
}
这个脚本执行生成的Html文件如下:


测试的CSP脚本文档



Hello World!


将在浏览器中显示“Hello World!”字样。
可 以看出,csp脚本其实就是一个标准的C++格式文件,不同的是其中有部分注解是以/*Http开始的,结束*/和一般的注解相同。凡出现在/*Http 和*/之间的内容均会原封不动的出现在最终生成的Html文件中,包括紧接着/*Http后面的空格和回车换行符号等。
HttpMain()是所 有csp脚本的执行入口,所有代码都是从这里开始执行的。echo是一个内部定义的宏,其作用是将echo后的内容输出到html文件中。echo最终是 由FCString类库提供的“+=”操作符实现的,echo支持的类型取决于FCString支持的类型,包括FCDateTime、char*、 FCString、int、double等,几乎涵盖网页中可能使用到的变量类型。
#i nclude "base.h" 是加入基本支持库的头文件,基本支持库中定义了Http基本请求的处理类,实现Cookie、Content、Query等行为,以及csp内部支持所需的HttpMain原型和echo宏等内容。
如何编写网页内容,实际上就是如何在代码中使用由基本支持库,以及用户扩展支持库中所提供的支持函数和类库。


配置您的csp环境

配置CSP分作三个步骤:
第 一个步骤是让您的机器可以运行CSP的脚本,这是所有的基础,目前CSP1.0仅支持在IIS或者PWS中运行,并且建议在IIS5.0以上,原理上在 Apache中也可以运行,配置如同在Apache中配置php的CGI Binary一样。但目前并未将CSP1.0在各个Apache版本中测试过。您可以在Apcahe中配置并测试运行CSP的1.0版本,如果有任何问题 或者Bug的报告请和:联系。
配置CSP第二步骤是CSP.ini的配置,这个并不是必须的,安装后的缺省配置既可让您的CSP引擎正常工作,除非您需要更高级的配置。
第 三个步骤是配置Dreamweaver,这个完全是为了编辑Html文本更方便一些,实际上大多数Web页面的设计者都是离不开类似 Dreamweaver工具的。配置Deamwaver可能是您在编辑CSP时更顺手一些。但需要记住,Dreamweaver并不是C++编辑器,您可 能还要选择一个适合的C++编辑器来协同工作。


先让你的机器可以运行CSP脚本

要想使您的Web Service支持CSP,您需要在您的服务器上安装CSP引擎,在本站的Download页面中包括有CSP引擎的下载,整个CSP引擎包括 CSP.exe、Basespt.dll、MysqlDB.dll以及Borland BCB5 Free Compilor的部分文件,在使用CSP之前请阅读Borland BCB5 Free Compilor的许可协议。
目前的CSP1.0只支持IIS和PWS,不能支持在Apache家族中工作,也不能运行于Linux操作系统,希望在Linux或者Apache服务器运行CSP脚本请期待后续版本。
下载Setup.exe后运行出现安装提示,您可以指定一个适合的路径以安装CSP引擎,建议安装尽可能靠近根目录,并且安装在符合Dos格式的路径中有利于提高运行效率。

QUOTE:
安装完毕后,Setup自动调用IIS的配置管理器,您需要配置的仅仅是添加csp的应用程序映射.
打开需要配置站点的属性页,选择主目录标签,点击应用程序项中的配置按钮,对Csp进行配置。
点击添加按钮,打开“添加/编辑应用程序扩展名映射”对话框。
其中可执行文件选择Csp安装路径中Bin\的csp.exe,扩展名选择“.csp”,注意扩展名是区分大小写的,必须为小写字母。


如 果您安装CSP的磁盘是NTFS格式,您可能还需要设置的是用户对Csp\Bin路径的权限,通常要求Bin目录对Internet来宾有可执行权限, Bin\Binary对Internet来宾有可写入权限,Bin\Compile对Internet来宾有可执行权限,Bin\Compile\ Temp有可写入权限,除此以外对于存放CSP脚本文件的IIS虚拟目录必须开放执行脚本的权限。
对于Windows 2003的服务器还需要作的是配置“Web 服务器扩展”只有在Web 服务器扩展中制定的CGI、ISAPI接口才会被IIS载入并执行。关于如何配置Web 服务器扩展请参考Windows 2003的联机帮助,或访问Microsoft网站以获得相信信息。


CSP的高级配置

对于CSP 的工作可以通过配置CSP.ini文件来完成,CSP.ini文件位于CSP安装目录中bin目录下,所有和CSP运行相关的文件都在这里存放。,下面是 缺省的CSP.ini的配置。当修改CSP.ini的配置后,将会影响到CSP引擎的工作状态,最好在修改前作以备份,如果您没有备份的话,对某项配置的 值并不清出,可以清除该项在CSP.ini文件中,当一个项目不存在的时候,CSP.exe将按照缺省的配置处理之。
QUOTE:
Compilor=Compile\Bin\BCC32.exe
Compile Option=-5 -c -xd- -RT- -o
Include Path=Compile\Inc
Linker=Compile\Bin\ilink32.exe
Link Option=-x -Gn -Tpd -Hc:0x100000
Link Files=dllMain.obj c0d32.obj import32.lib cw32mti.lib cw32.lib
Library Path=Compile\Lib
File Extention=FCB
Compress=1
Debug=0
Content Length=1024
Upload File Type=.jpg;.gif;.zip;.htm;.html;.swf;.bmp;.js;.jpeg;,png;.mov;.avi;
这些配置的内容都是显而易见的,通过参数的名字就可以猜到其用途:
Compilor用来指定编译器,在这个版本中,编译器之允许是Borland C++ Compilor,并且要求其版本大于5.0,在这个版本的CSP中使用Borland扩充的C++关键字,因此不支持其他编译器如gcc,VC等。
Compile Option是用来指定编译器选项的,如果你不熟悉BCC32.exe,建议不要轻易修改该选项,除非你需要更多的支持,也不要轻易修改本选项。
Include Path指定编译器的头文件的路径,这个路径是相对于CSP.ini所在的位置,当然也指定多个路径和绝对路径,但是第一个路径必须是相对于CSP.ini所在路径的,其他路径需要使用“;”分开。
Linker为CSP指定连接器,因为BC编译器使用OWF格式的Obj文件,并且该版本提供的其他Lib和Obj都是OWF格式,因此编译器只能选择Borland连接器或者兼容的连接器。
Link Option用于指定连接器的命令行选项,不熟悉ilink32.exe用户请不要随意修改该选项。
Link Files指定连接器需要连接的其他文件,缺省配置中的几个文件是必须的,包括csp二进制文件的入口和csp使用的全局变量都在这几个文件中有定义,也不要轻易修改这几个obj和Lib的内容,否则可能造成不能正确连接的错误。
被 编译器连接的文件出了该选项指定的文件外,还可以通过csp文件中的#pragma link "×××.lib"来添加其他需要连接的文件,比如这个版本中不提供数学函数库,但是完全可以通过添加头文件到包含目录,以及增加连接标准库中的数学库来 实现csp对数学函数的支持。但是这是一个非常危险的行为,其一是修改任何缺省以外的配置,必须为其安全性考虑,如果您将一些非常“危险”的API的头文 件和Lib文件提供的话,csp程序则可以通过csp代码来执行一些非常不安全的代码,比如删除文件,获取系统保密信息等操作。其二是增加的连接文件势必 会造成联机速度的下降,和效率的低下;因此在非必要的情况下,一般建议不要修改这些配置。
Library Path指定库文件的路径。
File Extention这是用来指定编译后二进制文件扩展名的,尽管csp的现场编译允许使用跟多字符的扩展名,但是通常建议扩展名不要超过三个字符,这个扩展名只是csp引擎内部使用的,和Web浏览的用户没有任何关系,也不会影响到执行结果。
Compress用来指定编译后的二进制文件是否需要压缩,该版本的CSP提供的是UPX压缩程序,如果您不希望压缩,或者是在调试程序时,可以将这个选项关掉,该选项的有效值为0、1,分别表示不压缩和压缩。
Debug用于配置是否调试文件,缺省为不调试,当调试打开是,现场编译器不会删除编译过程中生成的临时文件,这个文件主要是将csp转换为包含html信息的CPP文件,其位置在Compilor\Temp目录,通过这个文件可以检查不必要的语法错误以及逻辑错误等。
Content Length用来限制Content内容的大小,这个数字是以K为单位的,限制的目的是为了在Post方法中不会受到大文件上传的而影响服务器的性能,您可以根据实际需要来配置适当的大小。
Upload File Type是用来指定可以被上传文件类型的,这个版本的CSP不提供文件上传的自解压,但是允许压缩文件上传,对上传文件类型的限制,有助于防止非法上传带 有恶意的csp代码等,C++语言的强大功能使得使用时要非常小心的,开放csp的上传权限可能造成安全隐患,比如用户在csp中声明一个API的原型, 并且通过#pragma link参数可以连接库文件,如此以来,很多“危险”的API可能被csp页面执行,从而造成安全隐患。


(CSP现在只支持IIS,还没有消息说支持apache)

语法约定

其实csp根本没有什么需要约定的语法,因为所有的语法都是来自于Http和C++,但是这里还是需要简单讲述一下,所谓的语法约定不是真正的语法,而是我们在这个版本的CSP中所涉及到的一些约定,这些约定可能决定着您的csp文件是否能被正确的编译。

入口程序

任何一个C++或者C程序都有一个入口,如在Dos和Linux中是main函数,Windows中是WinMain作为入口的,我们的csp程序是以HttpMain开始的,其原型如下:
QUOTE:
int HttpMain( );

在这个函数中代码是首先被执行的,在这个函数内部的http代码也是最先被输出的。
需 要记住的是,csp是完全兼容C++的,就是说一个合法的csp文件是可以直接在C++编译器中编译而没有语法错误的,但是有一个例外情况是, /*Http和*/标签以内的内容现场编译器在编译的时候会进行一次翻译,因为这部分内容是需要向浏览器输出的,而这个标签内部的文字最终是依靠调用 csp支持库中的函数来完成的,因此在函数体以外不能包含/*Http*/标签,否则可能不能正确的被编译,但这个写法在C++文件中是没有问题的。

/*Http */标签

在Hello World中我们已经提到过,在这个标签以内的文字将原封不动的被输出到Html格式的文件中了,也正象上面提到的,这个标签只能出现在一个函数的内部。
在 这个标签内部的文字都会一丝不苟的被输出,这是对于常规的字符,包括了“‘”,“””等,但是本身就是转义字符的“\”是需要注意的一个特例,在该标签内 部的字符最终需要转换为C++语言中的字符串,因此在遇到“\”字符是需要使用正反斜杠“/ \”类替换,但这种情况不是非常多的出现。

_ExtProc宏

这是一个预定义的宏,其原型是:

QUOTE:
#define _ExtProc extern "C" __declspec(dllexport)


这是用在定义能够被其他csp单元使用的函数用到的,关于如何定义一个被其他csp调用的函数,请参考Use函数的用法,在这里之需要知道能够被其他csp引用的函数必须是_ExtProc类型的,并且没有任何参数。

echo 宏

这是从php中泊来的一个宏,在我们的csp中将是一个保留的准关键字,请不要使用相同的函数、变量名称。echo的原型如下:
QUOTE:
#define echo   Response->Content +=

其实现过程是通过FCString的+=运算符来实现的。

全局变量Request

这是用来获取Http请求的对象,其类型是FCRequest*,也是csp和Web Servide交流的主要途径,任何的Http请求都是通过Request来获取的。

全局变量Responese

是 用来响应客户端的,其类型是FCResponse*,任何输出到浏览器的信息都是通过Response来完成的,包括echo 、/*Http*/标签等都是最终通过Response完成的。不要定义和Request、Response相同的变量和函数,C++的作用域可能会产生 负面影响,导致该语法正确,但是无法正确的编译。

编译条件__CSPFieldCompiled

这是 csp内部用来协调的一个条件编译宏,定义该宏的主要目的是减少原始类库和运行是编译的头文件之间的关联,该条件使得很多代码在设计类库是是有用的,但是 在运行csp时是无效的,同时也使得很多头文件的滚动包含在csp运行时不会包含在所需要的头文件中,这样的目的是减轻了编译器的负担,同时简化的编译过 程,此外利用该宏控制某些类的成员,在设计类库时是正确的类型,而在csp运行是,只是一个合理的占位符。如果您不是想要扩充csp的支持类库,请不要轻 易使用和改变该宏的定义。

关于数据有效性和异常

CSP完全支持标准C++和Windows方式的异常,但是在CSP提供的类库中我们特别的做出这样一个不合理的约定。
所 有类库的操作,该类不进行任何非法数据、越界访问等错误进行通报,在通常在C++类库中,遇到这样情况时,将会象调用者抛出一个异常,以便能够即时处理不 正确的数据,但在CSP的类库中,我们不是这样操作,取而代之的是向调用者,或者使用着返回一个缺省的,并不一定合理的结果。比如在FCString中使 用
QUOTE:
FCString Test = “XYZ”;
Test.ToInt();

通常的C++类库可能出现一个异常,以便让调用者知道这个参数内容是不可以被转换为整数的,但是在CSP中则可能返回的是一个整数0。
这和常规C++类库中抛出异常是不一样的处理过程,因为不恰当的异常则可能是服务器压力增大的一个因素,在所有CSP的类库中都是这样一个原则,宁愿输出一个错误的数据,也不能给调用者一个可能导致服务器需要额外处理的异常。
这 种折中的方法是使用CSP的用户必须了解的,这样作的目的是减小在设计CSP时过多的使用烦琐的异常处理机制,但牺牲的是可能造成的数据的错误。而错误的 数据对一个Web页面来说可能并不是一个非常大的问题,但是一个意料不到的异常则可能使联系运行的Seb Service服务压力不断增长。

关于文件版本和编译其启动的条件

CSP对csp代码进行现场编译的,当csp被调用时,编译器需要决定是否对这个csp文件进行编译,以确保csp文件的更新能够即时的反映在客户端的请求之中,这存在一个如何仲裁的问题。
CSP引擎不保留任何csp文件的内容方面的信息,也就是说CSP不可能智能的通过判断一个csp文件的内容是否给更改过,来决定是否启动编译器,当然,对每一次csp的调用都进行编译也是最愚蠢不过的了,也就失去了csp的原本目的了。
在CSP的主进程中,判断csp文件是否编译的唯一依据是这个文件的修改时间以及其他相关的时间信息,这意味着,一个文件的时间信息被修改则可能引起编译器对其进行编译!
需 要注意的一点是,使用C语言的#i nclude包含的文件被修改时,不可能引起编译器的注意,所有include进来的文件改变时,都不会导致编译器调用时重新编译,但是通过Use函数引 用的csp文件则可以正确的被编译或者重构,也就是所当你使用Use函数引用一个csp文件时,这个文件如果发生变化,则Use函数将会重新编译之,并能 够输出正确的结果。


好了,先说这么多,还有就是关于CSP的类库了,剩下还有两个问题:

1。csp的官方网站,在手册里给的网址是:CSPDev.Org
     CSP1.0  2005年4月24日

  不过,没打开  

2. 关于CSP的版权问题,好象不是开源软件,呵呵,没有找到官方的license
阅读(1308) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~