作者:siyu
cgic: 为C语言编写CGI的C函数库
由Thomas Boutell开发
目录
CGIC介绍
怎样写CGIC应用程序
怎样产生图片在CGIC中?
CGI调试特征: 利用捕获
cgic函数参考
cgic变量参考
cgic结果编码参考
cgic快速索引
一般的UNIX系统都支持ANSIC,增加相应的库函数(和相应的h文件)就可以实现CGI。在此我向大家推荐一个用于CGI编程的ANSIC库:cgic。
cgic是用来生成基于CGI的WWW应用程序的C语言函数库,它有以下功能:
*对数据进行语法分析
*接收以GET和PSOT两种方式发送的数据
*把FORM中的不同域连接成连续的串
*为检索FORM数据而提供字符串,整数,浮点以及单项和多项选择功能
*为数字字段提供边界检测
*把CGI环境变量加载到非空的C串中
*为调试而捕捉CGI状态
*提供相对安全的系统调用功能
用一般ANSI C或C++编译器就可以编译cgic程序,不过与通常C程序不同的是,用cgic写的源码其主函数是cgiMain(),而不是通常的main()。cgic的函数库会自动把cgiMain连接到相应的main()上去。
--------------------------------------------------------------------------------
写CGIC程序
Note: 所有的cgic应用程序必须连接cgic.c.
用cgimain()替代main() 必须包含: #include"cgic.h."
基本结构cgictest.c:
int cgiMain() {
#if DEBUG
/* Load a saved CGI scenario if we're debugging */
cgiReadEnvironment("/path/to/capcgi.dat");
#endif
/* Important: we must indicate the type of document */
cgiHeaderContentType("text/html");
/* Now invoke other functions to handle each part of the form */
fprintf(cgiOut, "
/n");
fprintf(cgiOut, "cgic test/n"):
fprintf(cgiOut, "
/n", name); } 这个函数的功能就是取的并显示由用户输入的name . 处理输出 Important: cgiOut通常相当于stdout cgiFormString 确保断航 处理单一Checkboxes输入 这个Hungry() function确定用户是否选择"hungry"这个 checkbox: void Hungry() { if (cgiFormCheckboxSingle("hungry") == cgiFormSuccess) { fprintf(cgiOut, "I'm Hungry!
/n"); } else { fprintf(cgiOut, "I'm Not Hungry!
/n"); } } 这个函数依靠 cgiFormCheckboxSingle() 确定单一的checkbox 被选择。 cgiFormCheckboxSingle() 接受checkbox名字的属性值,如果存在就返回 cgiFormSuccess,否则返回cgiFormNotFound 如果是多项checkboxes,就用 cgiFormCheckboxMultiple()和cgiFormStringMultiple() 函数. 处理数字输入 Temperature() 返回浮点书的值确保在特定的返回内。 void Temperature() { double temperature; cgiFormDoubleBounded("tem perature", &temperature, 80.0, 120.0, 98.6); fprintf(cgiOut, "My temperature is %f.
/n", temperature); } 依靠cgiFormDoubleBounded()得到数据.第一个数据是返回数据中输入域的名字。最后一个值是用户没有提交时的默认值。 这个函数总是找回在特定返回内合适的值; cgiFormDoubleBounded返回的值被检查确信用户输入的资料在规定范围内, 而不是其他无效的数据。查看 cgiFormDoubleBounded() 更多的资料. 如果限度检查不理想,可以用 cgiFormDouble() 替代. 在整数输入,cgiFormInteger 和 cgiFormIntegerBounded 可以利用. 这些函数的功能类似. 处理单一选择输入 HTML标签被用于向用户提供几个选择. Radio buttons 和checkboxes 椰油这样的用途,大门、能够选择的数量很小时. Color()
char *colors[] = {
"Red",
"Green",
"Blue"
};
void Color() {
int colorChoice;
cgiFormSelectSingle("colors", colors, 3, &colorChoice, 0);
fprintf(cgiOut, "I am: %s
/n", colors[colorChoice]); } 这个函数确定用户选择了几个选项从 在表但的列表. cgiFormSelectSingle()
cgiFormSelectSingle() 总是显示合理的选项值.
radio button也可以用这个函数.另外还有 cgiFormRadio(), 也是一样的
处理多项选择的输入
NonExButtons()
char *votes[] = {
"A",
"B",
"C",
"D"
};
void NonExButtons() {
int voteChoices[4];
int i;
int result;
int invalid;
char **responses;
/* Method #1: check for valid votes. This is a good idea,
since votes for nonexistent candidates should probably
be discounted... */
fprintf(cgiOut, "Votes (method 1):
/n"); result = cgiFormCheckboxMultiple("vote", votes, 4, voteChoices, &invalid); if (result == cgiFormNotFound) { fprintf(cgiOut, "I hate them all!
/n"); result = cgiFormStringMultiple("vote", &responses); if (result == cgiFormNotFound) { fprintf(cgiOut, "I hate them all! 标签. 这个信息不需要解吸,除非用 标签通常由CGIC函数库自动解析。
char *cgiRemoteHost
从浏览器返回客户主机的名字
char *cgiRemoteAddr
从浏览器返回客户的IP地址
char *cgiAuthType
返回用户授权信息
char *cgiRemoteUser
鉴别用户 cgiAuthType.
char *cgiRemoteIdent
返回用户的名字(用户通过用户坚定协议)这个消息是不安全的,特别是Windows系统。
char *cgiContentType
返回MIME内型
char *cgiAccept
参考 cgiHeaderContentType() cgiUserAgent
char *cgiUserAgent
取的用户浏览器信息
char *cgiReferrer
指向用户访问的URL.
int cgiContentLength
表单或查询数据的字节被认为是标准的.
FILE *cgiOut
CGI输出. cgiHeader函数,象cgiHeaderContentType, 首先被用于输出mime头; 用于 fprintf() 和fwrite(). cgiOut通常相当于stdout。
FILE *cgiIn
CGI输入. 在决大部分时间你都不会需要这个函数。
cgic结果编码参考
在大量的按列中, cgic函数有计划的产生合理的结果,甚至浏览器和用户不合理时。无论如何, 有时候知道不合理的事情发生,尤其赋予一个值或定义一个范围是一个不充分的解决方案。下面的这些结果编码有助更好了解。
cgiFormSuccess
提交信息成功
cgiFormTruncated
删除部分字节.
cgiFormBadType
错误的输入信息(没有按要求)
cgiFormEmpty
提交信息为空.
cgiFormNotFound
提交信息没有找到.
cgiFormConstrained
数字属于某个特定的范围,被迫低于或高于适当范围。
cgiFormNoSuchChoice
单一选择提交的值是不被接受。通常说明表但和程序之间存在矛盾。
cgiEnvironmentIO
从CGI环境或获取的文件读或写的企图失败,报出I/O的错误。
cgiEnvironmentMemory
从CGI环境或获取的文件读或写的企图失败,报出out-of-memory的错误。
cgiEnvironmentSuccess
从CGI环境或获取的文件读或写的企图成功。
cgic快速索引
cgiAccept | cgiAuthType | cgiContentLength | cgiContentType | cgiEnvironmentIO | cgiEnvironmentMemory | cgiEnvironmentSuccess | cgiFormBadType | cgiFormCheckboxMultiple() | cgiFormCheckboxSingle() | cgiFormConstrained | cgiFormDouble() | cgiFormDoubleBounded() | cgiFormEmpty | cgiFormInteger() | cgiFormIntegerBounded() | cgiFormNoSuchChoice | cgiFormNotFound | cgiFormRadio() | cgiFormSelectMultiple() | cgiFormSelectSingle() | cgiFormString() | cgiFormStringMultiple() | cgiFormStringNoNewlines() | cgiFormStringSpaceNeeded() | cgiFormSuccess | cgiFormTruncated | cgiGatewayInterface | cgiHeaderContentType() | cgiHeaderLocation() | cgiHeaderStatus() | cgiIn | cgiMain() cgiOut | cgiPathInfo | cgiPathTranslated | cgiQueryString | cgiReadEnvironment() | cgiReferrer() | cgiRemoteAddr | cgiRemoteHost | cgiRemoteIdent | cgiRemoteUser | cgiRequestMethod | cgiScriptName | cgiServerName | cgiServerPort | cgiServerProtocol | cgiServerSoftware | cgiStringArrayFree() | cgiUserAgent | cgiWriteEnvironment()
cgic test
/n"); Name(); Address(); Hungry(); Temperature(); Frogs(); Color(); Flavors(); NonExButtons(); RadioButtons(); fprintf(cgiOut, "/n"); /* This value will be the exit code of the program; 0 generally indicates success among Unix and DOS programs */ return 0; } capture 输出标头 cgiHeaderContentType()在输出文挡之前简要说明MIME内型,如 "text/html"。 cgiHeaderStatus()代替输出错误代码 cgiHeaderLocation()代替重新引导至其他页面。在一个独立的应用程序中只能有一个cgiHeader函数。 重点:在cgiHeader函数组中, cgiHeaderContentType(), 在任何向浏览器输出之前被调用. 否则将出错或浏览器不能识别。 cgiOut 接着, cgiMain() 调用不同的函数.当函数结束后,将返回0 处理输入文本 void Name() { char name[81]; cgiFormStringNoNewlines("name", name, 81); fprintf(cgiOut, "Name: %s/n", name); } 这个函数的功能就是取的并显示由用户输入的name . 处理输出 Important: cgiOut通常相当于stdout cgiFormString 确保断航 处理单一Checkboxes输入 这个Hungry() function确定用户是否选择"hungry"这个 checkbox: void Hungry() { if (cgiFormCheckboxSingle("hungry") == cgiFormSuccess) { fprintf(cgiOut, "I'm Hungry!
/n"); } else { fprintf(cgiOut, "I'm Not Hungry!
/n"); } } 这个函数依靠 cgiFormCheckboxSingle() 确定单一的checkbox 被选择。 cgiFormCheckboxSingle() 接受checkbox名字的属性值,如果存在就返回 cgiFormSuccess,否则返回cgiFormNotFound 如果是多项checkboxes,就用 cgiFormCheckboxMultiple()和cgiFormStringMultiple() 函数. 处理数字输入 Temperature() 返回浮点书的值确保在特定的返回内。 void Temperature() { double temperature; cgiFormDoubleBounded("tem perature", &temperature, 80.0, 120.0, 98.6); fprintf(cgiOut, "My temperature is %f.
/n", temperature); } 依靠cgiFormDoubleBounded()得到数据.第一个数据是返回数据中输入域的名字。最后一个值是用户没有提交时的默认值。 这个函数总是找回在特定返回内合适的值; cgiFormDoubleBounded返回的值被检查确信用户输入的资料在规定范围内, 而不是其他无效的数据。查看 cgiFormDoubleBounded() 更多的资料. 如果限度检查不理想,可以用 cgiFormDouble() 替代. 在整数输入,cgiFormInteger 和 cgiFormIntegerBounded 可以利用. 这些函数的功能类似. 处理单一选择输入
/n", colors[colorChoice]); } 这个函数确定用户选择了几个选项从
/n"); result = cgiFormCheckboxMultiple("vote", votes, 4, voteChoices, &invalid); if (result == cgiFormNotFound) { fprintf(cgiOut, "I hate them all!
/n"); } else { fprintf(cgiOut, "My preferred candidates are:/n"); fprintf(cgiOut, "
- /n"); for (i=0; (i < 4); i++) { if (voteChoices[i]) { fprintf(cgiOut, "
- %s/n", votes[i]); } } fprintf(cgiOut, "
/n"); result = cgiFormStringMultiple("vote", &responses); if (result == cgiFormNotFound) { fprintf(cgiOut, "I hate them all!
/n"); } else { int i = 0; fprintf(cgiOut, "My preferred candidates are:/n"); fprintf(cgiOut, "
- /n"); while (responses[i]) { fprintf(cgiOut, "
- %s/n", responses[i]); i++; } fprintf(cgiOut, "