发布 C 语言 CGI 开发库 Sky CGI Lib 源码,采用 BSD 许可证。
sanyasky
|
1#
sanyasky 发表于 2007-05-16 07:01
发布 C 语言 CGI 开发库 Sky CGI Lib 源码,采用 BSD 许可证。
------------------------------------------------------------------------------------------------
-------- Sky CGI Lib, ver 0.01, 2007-05-13. -------- Copyright (c) 2001-2007, sanyasky.com <widom@126.com> All rights reserved. Sky CGI Lib 采用 BSD 许可证,任何人在遵守 BSD 许可协议的前提下,可以自由使用、修改、再发布。 欢迎您指出缺点和寻找错误,留言和最新版下载请到 http://sanyasky.com BSD 许可证在本文末尾。 ------------------------------------------------------------------------------------------------ 一、特点 Sky CGI Lib 是 C 语言编写的 CGI 服务器端开发库,能够在 FastCGI 模式,或者非 FastCGI 模式下,在 Apache 或者 IIS 等服务器上稳定地开发和运行。 使用 C 语言开发的 CGI 应用程序执行效率高,但缺点是开发速度比较慢,为避免这个缺点,Sky CGI Lib 专门设计用于 CGI 开发的数据结构和函数,并且优化一些专用于 CGI 的算法,加上 C 语言固有的简洁语法,使 CGI 程序的开发速度接近或部分高于传统的 Perl 语言。 Sky CGI Lib 的函数有六类:内存管理、输入、处理、保存、输出、前五类函数的支持函数。这些函数能够只用一次调用而完成 cookie、表单、文件等 CGI 数据的解析、保存、发送,开发人员不必关心 CGI 处理的细节,只要专注于应用领域的开发,最大程度地避免重复开发,减轻开发负担。 Sky CGI Lib 带有 FastCGI 开发库和采用 BSD 许可证的 sha2 信息摘要算法源代码,使基于 Sky CGI Lib 开发的 CGI 程序更加高效、安全。 Sky CGI Lib 注重可移植能力,提供在 WIN32 和 Linux 平台上相同的调用代码,避免开发人员分心于平台的差别。 专有的内存管理方案,使基于 Sky CGI Lib 的开发不必关注动态内存的释放,即使运行在 FastCGI 这种常住内存的模式,每次正常或非正常结束 CGI 会话时,Sky CGI Lib 都会自动释放应当释放的动态内存,避免内存泄漏。 Sky CGI Lib 的 CGI 输入数据解析算法经过特别优化,比作者目前寻找到的其它同类 C 算法优化程度高,能达到某些嵌入式或大量数据传输等特殊 CGI 应用的要求。 二、使用方法和示例 Sky CGI Lib 的一个简单示例程序在这里: http://sanyasky.com/cgi-bin/sky/sky.cgi Sky CGI Lib 所有数据结构和函数的定义与功能,请参考源代码 skycgi/src 目录下的 skycgi.h 和 skycgi.c 文件;开发 CGI 应用程序的方法,请参考源代码 skyapp/src 目录下的 sky.c 文件。下面做简略的补充说明: 在 CGI 应用程序中,Sky CGI Lib 的函数调用先后次序应当是: wNewSe()、wCkTest()、wSetCookie()、wHtmHead()、wFile()、……、wTimeUsed(n)、wEndSe() 。 其中 wNewSe()、wEndSe() 包含初始化、加锁、解析并整理数据、解锁、FastCGI适应性处理等功能,所以必须调用;其它函数是否调用,根据需要选择。 Sky CGI Lib 的 CGI 输入数据分成三种:URL/FORM、COOKIE、上传的文件。三种数据分别由以下三个函数查询或保存,函数的详细使用方法和定义请参考 skycgi.c : void *wForm(char *name); void *wCookie(char *name); int wFile(char *name, char *path); Sky CGI Lib 的数据解析、整理,由 CGI 会话开始的 wNewSe() 一次完成,不必另外手工调用其它函数,详情请看 skycgi.c 顶部的介绍和函数定义,以及 skycgi.h 的结构声明。 Sky CGI Lib 的函数包括六类:内存管理、输入、处理、保存、输出、前五类函数的支持函数。这些函数实现完整的 CGI 处理功能,例如:解析数据、获取客户端真实 IP 地址、生成 session 标志、获取 URL 来源、URL 编解码、URL 重定向、COOKIE 适用性测试、发送 COOKIE 、发送文件、发送 http 头信息、发送 html 信息、发送格式化出错信息并退出运行、数值与十六进制字符串的高效率转换、获取当前时刻、获取程序运行时间长度、延时、十几个处理文件和目录的函数、数据暂存和恢复、单双字节混合字符串截取、汉字内码转换。 函数库集成的信息摘要算法,包括 RFC 标准中的 MD5 源码,和同样采用 BSD 许可证的 sha-256 、sha-512 源码。 上述所有函数的详细使用方法和定义请参考 skycgi.c 、skycgi.h 等文件。 源代码 skycgi/src 目录下的 skytest.h 和 skytest.c 只供学习、试验、测试使用,工程项目开发不必使用这两个文件中的函数,也不必包含 skytest.h 。 源代码 skyapp/bin 目录下的两个 .bin 文件是 BIG5 与 GBK 内码互转函数的转换数据文件,使用时与 .cgi 执行文件放在同一个目录。 FastCGI 的深入介绍请参考其网站: http://fastcgi.com 三、编译 这个编译简介仅供参考,如果您熟悉 makefile 的编写,那么不必参考下述编译简介。 作者使用 GCC 编译器,头文件和 makefile 按照 GCC 编写,如果您使用其它编译器,可能要适当地修改。 WIN32 平台: 作者使用 Dev-C++ ,安装在 d:\Dev-Cpp 目录; Sky CGI Lib 源码解压后放在 d:\webx\sky ; 把 d:\webx\sky 目录的 make.bat 复制到 d: 根目录 d:\ ; 打开命令提示符窗口(位置在:开始--所有程序--附件--命令提示符),然后转到 d 分区根目录,最后输入 make 回车,自动完成编译。 还可以在命令提示符窗口进入 d:\webx\sky 目录,然后执行 makesky 自动完成编译。 也可以不打开命令提示符窗口,只在资源管理器中直接双击 d:\make.bat ,或者 d:\webx\sky\makesky.bat 自动完成编译,但缺点是中途出错时自动关闭窗口,看不到出错信息。 编译后生成的 sky.cgi 文件在 d:\webx\sky\skyapp\bin ,如果已经安装好 Apache ,可以在 d:\webx\sky 目录双击快捷方式 cgi 执行。 Linux 平台: 源码解压后,把 sky 下一层的几个目录的 Makefile 文件删除,把 Makefile linux 改名为 Makefile ,然后在这几个目录分别打开控制台窗口,执行命令 make 。 四、WIN32 平台 Apache2 的相关安装配制 这个安装配制简介仅供参考,如果您熟悉 FastCGI 的安装,和 Apache 的配制,那么不必参考以下简介。 作者在 WIN32 平台的 Apache2 服务器安装在 d:\Apache 目录。 下载 FastCGI 的 Apache2 服务器模块,复制到 d:\Apache\modules 目录。下载地址: http://fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll 把 d:\webx\sky\服务器配制文件 目录中的 httpd.conf 复制到 d:\Apache\conf 。 这样以后: D:\webx 及其子目录,是普通 CGI 执行目录; D:\webx\sky\binfcgi 及其子目录,是 FastCGI 执行目录; D:\web 是 Apache 的文档根目录(DocumentRoot)。 五、计划中的改进目标 Sky CGI Lib 的当前版本为提高效率,输入的 CGI 数据全部传入内存再解析,所以此版本函数的上传数据量限制由服务器的内存等软硬件情况决定,可由 config.h 中的 wInfoMaxLen 和 wMultiMaxLen 设置,建议小于 5M 。不依赖软硬件环境的无限制版本在开发中。 Sky CGI Lib 下一步的目标是集成正则表达式等更多的简化开发工作的模块。 为加快初学者的阅读速度,源码特别增加一些额外的注解,注释稍显烦琐,在将来版本中可能适当精简。 ------------------------------------------------------------------------------------------------ Sky CGI Lib 欢迎您指出缺点和寻找错误,留言和最新版下载请到 http://sanyasky.com ------------------------------------------------------------------------------------------------ -------- Sky CGI Lib, ver 0.01, 2007-05-13. -------- Copyright (c) 2001-2007, sanyasky.com <widom@126.com> All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Sky CGI Lib nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 上述 BSD 许可协议的大略中文含义如下: 版权所有 (c) 2001-2007, sanyasky.com <widom@126.com> 保留所有权力 在满足下列条件的前提下,允许再发布经过或未经过修改的、源代码或二进制形式的本软件: 1.源代码的再发布,必须保留原来代码中的版权声明、这几条许可条件细目,和下面的免责声明。 2.二进制形式的再发布,必须在随同提供的文档和其它媒介中,复制原来的版权声明、这几条许可条件细目,和下面的免责声明。 3.如果没有特殊的事前书面许可,原作者的组织名称,和贡献者名字,都不能用于支持或宣传从既有软件派生的产品。 此软件由版权所有者和贡献者以“即此”方式提供。无论明示或暗示的,包括但不限于间接的关于基于某种目的的适销性、实用性,在此皆明示不予保证。在任何情况下,由于使用此软件造成的,直接、间接、连带、特别、惩戒或因此而造成的损害(包括但不限于获得替代品及服务、无法使用、丢失数据、损失盈利或业务中断),无论此类损害是如何造成的,基于何种责任推断,是否属于合同范畴,严格赔偿责任或民事侵权行为(包括疏忽和其他原因),即使预先被告知此类损害可能发生,版权所有者和贡献者均不承担任何责任。 |