您好,欢迎访问三七文档
cgic:为C语言编写CGI的C函数库2010-09-1413:43:18分类:C/C++CGIC介绍一般的Unix系统都支持ANSIC,增加相应的库函数(和相应的h文件)就可以实现CGI。在此我向大家推荐一个用于CGI编程的ANSIC库:cgic。cgic是用来生成基于CGI的语言函数库,它有以下功能:*对数据进行语法分析*接收以GET和PSOT两种方式发送的数据*把FORM中的不同域连接成连续的串*为检索FORM数据而提供字符串,整数,浮点以及单项和多项选择功能*为数字字段提供边界检测*把CGI环境变量加载到非空的C串中*为调试而捕捉CGI状态*提供相对安全的系统调用功能用一般ANSIC或C++编译器就可以编译cgic程序,不过与通常C程序不同的是,用cgic写的源码其主函数是cgiMain(),而不是通常的main()。cgic的函数库会自动把cgiMain连接到相应的main()上去。--------------------------------------------------------------------------------写CGIC程序Note:所有的cgic应用程序必须连接cgic.c.用cgimain()替代main()必须包含:#includecgic.h.基本结构cgictest.c:intcgiMain(){#ifDEBUGcgiReadEnvironment(/path/to/capcgi.dat);#endifcgiHeaderContentType(text/html);fprintf(cgiOut,HTMLHEAD\n);fprintf(cgiOut,TITLEcgictest/TITLE/HEAD\n):fprintf(cgiOut,BODYH1cgictest/H1\n);Name();Address();Hungry();Temperature();Frogs();Color();Flavors();NonExButtons();RadioButtons();fprintf(cgiOut,/BODY/HTML\n);return0;}capture输出标头cgiHeaderContentType()在输出文挡之前简要说明MIME内型,如text/html。cgiHeaderStatus()代替输出错误代码cgiHeaderLocation()代替重新引导至其他页面。在一个独立的应用程序中只能有一个cgiHeader函数。重点:在cgiHeader函数组中,cgiHeaderContentType(),在任何向浏览器输出之前被调用.否则将出错或浏览器不能识别。cgiOut接着,cgiMain()调用不同的函数.当函数结束后,将返回0处理输入文本voidName(){charname[81];cgiFormStringNoNewlines(name,name,81);fprintf(cgiOut,Name:%sBR\n,name);}这个函数的功能就是取的并显示由用户输入的name.处理输出Important:cgiOut通常相当于stdoutcgiFormString确保断航处理单一Checkboxes输入这个Hungry()function确定用户是否选择hungry这个checkbox:voidHungry(){if(cgiFormCheckboxSingle(hungry)==cgiFormSuccess){fprintf(cgiOut,I'mHungry!BR\n);}else{fprintf(cgiOut,I'mNotHungry!BR\n);}}这个函数依靠cgiFormCheckboxSingle()确定单一的checkbox被选择。cgiFormCheckboxSingle()接受checkbox名字的属性值,如果存在就返回cgiFormSuccess,否则返回cgiFormNotFound如果是多项checkboxes,就用cgiFormCheckboxMultiple()和cgiFormStringMultiple()函数.处理数字输入Temperature()返回浮点书的值确保在特定的返回内。voidTemperature(){doubletemperature;cgiFormDoubleBounded(temperature,&temperature,80.0,120.0,98.6);fprintf(cgiOut,Mytemperatureis%f.BR\n,temperature);}依靠cgiFormDoubleBounded()得到数据.第一个数据是返回数据中输入域的名字。最后一个值是用户没有提交时的默认值。这个函数总是找回在特定返回内合适的值;cgiFormDoubleBounded返回的值被检查确信用户输入的资料在规定范围内,而不是其他无效的数据。查看cgiFormDoubleBounded()更多的资料.如果限度检查不理想,可以用cgiFormDouble()替代.在整数输入,cgiFormInteger和cgiFormIntegerBounded可以利用.这些函数的功能类似.处理单一选择输入SELECTHTML标签被用于向用户提供几个选择.Radiobuttons和checkboxes椰油这样的用途,大门、能够选择的数量很小时.Color()char*colors[]={Red,Green,Blue};voidColor(){intcolorChoice;cgiFormSelectSingle(colors,colors,3,&colorChoice,0);fprintf(cgiOut,Iam:%sBR\n,colors[colorChoice]);}这个函数确定用户选择了几个选项从SELECT在表但的列表.cgiFormSelectSingle()cgiFormSelectSingle()总是显示合理的选项值.radiobutton也可以用这个函数.另外还有cgiFormRadio(),也是一样的处理多项选择的输入NonExButtons()char*votes[]={A,B,C,D};voidNonExButtons(){intvoteChoices[4];inti;intresult;intinvalid;char**responses;fprintf(cgiOut,Votes(method1):BR\n);result=cgiFormCheckboxMultiple(vote,votes,4,voteChoices,&invalid);if(result==cgiFormNotFound){fprintf(cgiOut,Ihatethemall!p\n);}else{fprintf(cgiOut,Mypreferredcandidatesare:\n);fprintf(cgiOut,ul\n);for(i=0;(i4);i++){if(voteChoices[i]){fprintf(cgiOut,li%s\n,votes[i]);}}fprintf(cgiOut,/ul\n);}参考cgiFormCheckboxMultiple(),cgiFormSelectMultiple().cgiFormCheckboxMultiple()cgiFormCheckboxMultipleNonExButtons()函数在cgictest.c:fprintf(cgiOut,Votes(method2):BR\n);result=cgiFormStringMultiple(vote,&responses);if(result==cgiFormNotFound){fprintf(cgiOut,Ihatethemall!p\n);}else{inti=0;fprintf(cgiOut,Mypreferredcandidatesare:\n);fprintf(cgiOut,ul\n);while(responses[i]){fprintf(cgiOut,li%s\n,responses[i]);i++;}fprintf(cgiOut,/ul\n);}cgiStringArrayFree(responses);}参考cgiFormStringMultiple()cgiFormStringMultiple()char**responses;cgiFormStringMultiple(vote,&responses);检查CGI环境变量将用到的变量这里,产生图象#includecgic.h#includegd.hchar*colors[]={red,green,blue};#definecolorsTotal3intcgiMain(){intcolorChosen;gdImagePtrim;intr,g,b;im=gdImageCreate(64,64);r=gdImageColorAllocate(im,255,0,0);g=gdImageColorAllocate(im,0,255,0);b=gdImageColorAllocate(im,0,0,255);cgiFormSelectSingle(color,3,&colorChosen,0);switch(colorChosen){case0:gdImageFill(im,32,32,r);break;case1:gdImageFill(im,32,32,g);break;case2:gdImageFill(im,32,32,b);break;}cgiHeaderContentType(image/gif);gdImageGif(im,cgiOut);gdImageDestroy(im);return0;}为调试而捕捉CGI状态cgic函数参考cgiFormResultTypecgiFormString(char*name,char*result,intmax)用于从输入域中copy字符串。他将域名max-1字节中的字符copy到缓冲区result。若域不存在,则copy一个空串到result缓冲区。在此函数中所有的新行由换行符代表。cgiFormResultTypecgiFormStringNoNewlines(char*name,char*result,intmax)它与cgiFormString函数相似,只是所有的CR和LF都被去掉了。cgiFormResultTypecgiFormStringSpaceNeeded(char*name,int*length)它返回指向name的字符串的长度,并将长度放入length中。cgiFormResultTypecgiFormStringMultiple(char*name,char***ptrToStringArray)若同一名字有多个输入域,或域中的字符串可以动态变化,那么你可以使用本函数。它把名为name的所有输入域的值放在prtToStringArray中。voidcgiStringArrayFree(char**stringArray)它释放了分配给stringArray的内存。cgiFormResultTypecgiFormInteger(char*name,int*result,intdefaultV)从输入域中取出整数放入result中。cgiFormResultTypecgiFormIntegerBounded(char*name,int*result,intmin,intmax,intdefaultV)若输入域中的整数在界限内则取出并放入result中。cgiFormResultTypecgiFormDouble(char*name,double*result,doubledefaultV)从输
本文标题:CGI介绍
链接地址:https://www.777doc.com/doc-2904608 .html