发布 C 语言 CGI 开发库 Sky CGI Lib 源码,采用 BSD 许可证。

发布 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.如果没有特殊的事前书面许可,原作者的组织名称,和贡献者名字,都不能用于支持或宣传从既有软件派生的产品。

此软件由版权所有者和贡献者以“即此”方式提供。无论明示或暗示的,包括但不限于间接的关于基于某种目的的适销性、实用性,在此皆明示不予保证。在任何情况下,由于使用此软件造成的,直接、间接、连带、特别、惩戒或因此而造成的损害(包括但不限于获得替代品及服务、无法使用、丢失数据、损失盈利或业务中断),无论此类损害是如何造成的,基于何种责任推断,是否属于合同范畴,严格赔偿责任或民事侵权行为(包括疏忽和其他原因),即使预先被告知此类损害可能发生,版权所有者和贡献者均不承担任何责任。

能不能改成tgz压缩的?俺现在的网络下不了.rar .zip .exe
我玩C CGI/FastCGI时间也不短了,感觉这方面很难找工作的
现在直接写Web服务器了.

你的那个makefile make.bat 写的不好,不应该限定路径和编译器
我在Windows平台上的做法是添加编译器路径到PATH,还有添加环境变量include和lib,这样很方便


QUOTE:
原帖由 xinglp 于 2007-5-16 10:29 发表
我玩C CGI/FastCGI时间也不短了,感觉这方面很难找工作的
现在直接写Web服务器了.

你的那个makefile make.bat 写的不好,不应该限定路径和编译器
我在Windows平台上的做法是添加编译器路径到PATH,还有添加环境变量include和lib,这样很方便

恩,C 是一把锋利的刻刀,能用于雕琢艺术品,也能用于制造模具。CGI/FastCGI 只是一种模具的规范,只要 C 的基础坚实,按照其它模具规范也能打造出精致的模具,用于制造产品。所以,不要把 C 这么好的工具限制在打造一种模具范围内,否则就浪费了 C 。开发软件,只要有 C ,几乎没有实现不了的东西,花花绿绿的世界,大部分是 C 外面的包装。

“添加编译器路径到PATH,还有添加环境变量include和lib”的方法,在比较复杂的实际工程开发环境中不推荐。make.bat 也不是正确常用的方法,标准的方法是写一个完整通用的 makefile ,为了帮助初学者理解模块划分的内涵,在 Sky CGI Lib 中把各个模块的 makefile 分开了,实际工程应用中,可以比较容易地改成一个完整通用的 makefile 。
非常感谢您的指正,象您这样专注技术的年轻人,只要放开眼光,潜力会发挥得非常好。


QUOTE:
原帖由 dajun 于 2007-5-16 10:02 发表
能不能改成tgz压缩的?俺现在的网络下不了.rar .zip .exe

对哦,听说 .rar 还有使用权限制,等有时间改成 tgz 压缩,十分感谢您提醒。

今天改成tgz压缩,原来的x2blog不能上传 .gz 或 .tar 文件,改到这里下载:
http://sanyasky.cublog.cn

欢迎各位朋友继续提出意见和建议,谢谢。

Good Job.
你的全部程序拜读了下, 想法很不错, 很期待 sky cgi lib 的新版.

另外, 几点建议:
1. 向流行的 asp, php, jsp 等开发工具看齐, 提供一套适于开发的工具包, 而不仅限于 cgi 库.
    这一点, 可以参考下 CSP/eybuild. 它同样是基于 C 的, 但它可以让你不写一句 C 代码即可
   生成一套完整的应用.  并把整个 web 站点(静态/动态/图片/CSS等)生成到一个 CGI 文件中.
    CSP 技术使 web 程序( HTML,CSS, JS) 和 C 代码进行有效的分离, 各司其职.

2. cgic 库可以参考下, 也是个不错的 cgi 的 c 库.

Good Luck!


QUOTE:
原帖由 newzy 于 2007-5-17 14:26 发表
Good Job.
你的全部程序拜读了下, 想法很不错, 很期待 sky cgi lib 的新版.
另外, 几点建议:
1. 向流行的 asp, php, jsp 等开发工具看齐, 提供一套适于开发的工具包, 而不仅限于 cgi 库.
    这一点, 可以参 ...


遇到 newzy 专业级的赞赏和指正很高兴,十分感谢。
前年也想过把 Sky CGI Lib 设计成象流行的WEB开发语言那样,包括整套开发工具包,另外特别地设计一套用中文编程的脚本,这个脚本也用在网页模板上。当时初步完成中文脚本语言的设计和脚本解释器原型,功能测试的结果和设想一致,后来学习 lua 等优秀脚本语言的技术,逐步优化这套中文脚本解释语言的时候,遇到 AJAX 逐步实用和成熟,经过深入分析,决定放弃网页模板和中文脚本,把程序和网页彻底分离,服务器端和客户端之间只传输数据而不是网页。(类似 php 常用的网页模板技术,不可避免地会在服务器端和客户端之间传输网页,造成大量重复传输、降低效率、使用户体验变坏。网页模板技术的开发思想和富客户端这种技术发展趋势不一致。)

除了内嵌于网页,和网页模板这两种技术不再考虑以外,Sky CGI Lib 的整套开发工具包还应当继续发展,请各位兄弟继续指导。

cgic 和其它几个 cgi 的 c 库,对他们有过学习或大略的了解,虽然都很好,各有特色,各有或多或少的不足,都应当继续发展,但遗憾都不是我们的同胞编写的。Sky CGI Lib 作为中华民族一员的作品,学习别人的同时,希望得到各位同胞的更多指正。

十分感谢各位兄弟的支持和建议。

认识 newzy 很高兴, newzy 非常专业。CSP/eybuild 很优秀,值得学习。


我读了楼主的代码,很不错。

打算深入学习下。