cgic: 为C语言编写CGI的C函数库

来源:互联网 发布:西安java工程师招聘 编辑:程序博客网 时间:2024/06/05 15:02

http://www.qqread.com/cgi-perl/v223877.html

cgic: 为c语言编写CGI的C函数库 由Thomas Boutell开发 目录 CGIC介绍 怎样写CGIC应用程序 怎样产生图片在CGIC中? CGI调试特征: 利用捕获 cgic函数参考 cgic变量参考 cgic结果编码参考 cgic快速索引 一般的UNIX系统都支持ANSIC。

  作者: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, "<HTML><HEAD>\n"); 
fprintf(cgiOut, "<T99vLE>cgic test</T99vLE></HEAD>\n"): 
fprintf(cgiOut, "<BODY><H1>cgic test</H1>\n"); 
Name(); 
Address(); 
Hungry(); 
Temperature(); 
Frogs(); 
Color(); 
Flavors(); 
NonExButtons(); 
RadioButtons(); 
fprintf(cgiOut, "</BODY></HTML>\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<BR>\n", name); 


这个函数的功能就是取的并显示由用户输入的name . 
处理输出 
Important: cgiOut通常相当于stdout 

cgiFormString 确保断航 

处理单一Checkboxes输入 
这个Hungry() function确定用户是否选择"hungry"这个 checkbox: 
void Hungry() { 
if (cgiFormCheckboxSingle("hungry") == cgiFormSuccess) { 
fprintf(cgiOut, "I'm Hungry!<BR>\n"); 
} else { 
fprintf(cgiOut, "I'm Not Hungry!<BR>\n"); 



这个函数依靠 cgiFormCheckboxSingle() 确定单一的checkbox 被选择。 cgiFormCheckboxSingle() 接受checkbox名字的属性值,如果存在就返回 cgiFormSuccess,否则返回cgiFormNotFound 如果是多项checkboxes,就用 cgiFormCheckboxMultiple()和cgiFormStringMultiple() 函数. 
处理数字输入 
Temperature() 返回浮点书的值确保在特定的返回内。 
void Temperature() { 
double temperature; 
cgiFormDoubleBounded("temperature", &temperature, 80.0, 120.0, 98.6); 
fprintf(cgiOut, "My temperature is %f.<BR>\n", temperature); 


依靠cgiFormDoubleBounded()得到数据.第一个数据是返回数据中输入域的名字。最后一个值是用户没有提交时的默认值。 
这个函数总是找回在特定返回内合适的值; cgiFormDoubleBounded返回的值被检查确信用户输入的资料在规定范围内, 而不是其他无效的数据。查看 cgiFormDoubleBounded() 更多的资料. 如果限度检查不理想,可以用 cgiFormDouble() 替代. 

在整数输入,cgiFormInteger 和 cgiFormIntegerBounded 可以利用. 这些函数的功能类似. 

处理单一选择输入 
<SELECT> 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<BR>\n", colors[colorChoice]); 


这个函数确定用户选择了几个选项从<SELECT> 在表但的列表. 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):<BR>\n"); 
result = cgiFormCheckboxMultiple("vote", votes, 4, 
voteChoices, &invalid); 
if (result == cgiFormNotFound) { 
fprintf(cgiOut, "I hate them all!<p>\n"); 
} else { 
fprintf(cgiOut, "My preferred candidates are:\n"); 
fprintf(cgiOut, "<ul>\n"); 
for (i=0; (i < 4); i++) { 
if (voteChoices[i]) { 
fprintf(cgiOut, "<li>%s\n", votes[i]); 


fprintf(cgiOut, "</ul>\n"); 


参考cgiFormCheckboxMultiple(), cgiFormSelectMultiple(). 
cgiFormCheckboxMultiple() cgiFormCheckboxMultiple 

NonExButtons() 函数在 cgictest.c: 

/* Method #2: get all the names voted for and trust them. 
This is good if the form will change more often 
than the code and invented responses are not a danger 
or can be checked in some other way. */ 
fprintf(cgiOut, "Votes (method 2):<BR>\n"); 
result = cgiFormStringMultiple("vote", &responses); 
if (result == cgiFormNotFound) { 
fprintf(cgiOut, "I hate them all!<p>\n"); 
} else { 
int i = 0; 
fprintf(cgiOut, "My preferred candidates are:\n"); 
fprintf(cgiOut, "<ul>\n"); 
while (responses[i]) { 
fprintf(cgiOut, "<li>%s\n", responses[i]); 
i++; 

fprintf(cgiOut, "</ul>\n"); 

/* We must be sure to free the string array or a memory 
leak will occur. Simply calling free() would free 
the array but not the individual strings. The 
function cgiStringArrayFree() does the job completely. */ 
cgiStringArrayFree(responses); 
}

回顾文章:用 c 写 CGI 程序简要指南

CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl、Fortran、Pascal、c语言等。但是用C语言编写的CGI程序具有执行速度快、安全性高等特点。Web服务器在调用使用POST方法的CGI程序时设置此环境变量,它的文本值表示Web服务器传送给CGI程序的输入中的字符数目,因此我们使用函数a。


原创粉丝点击