cgi的笔记资料

最近整理笔记时发现了cgi的笔记,想想当时稍费了些周折,现总结一下供需要的朋友参考。如有不妥的地方欢迎指出,共同讨论,我会及时更正。IC开发网:skU5KW

~:n&U[5H:wNZ5M0      当时有个任务要升级原来板子的cgi实现和控制页面,需要在原html页面中添加一些新功能,由于旧版的cgi是用C实现的,所以整个html页面也都是使用printf打印输出的,这样一来修改页面的时候就比较繁琐了。由于以前也没有接触过,搜索一阵之后,主要找到了perl,CGIlua和cgic。
*?8W6u+uZjWf"rC0      google后,出来的cgi首选就是perl,一眼望去,很多资料都说用perl实现,貌似提到perl已经是cgi的代名词了,就像当年的文曲星,一说到电子词典,大家马上想到的就是文曲星,以至于后来不管哪个厂家生产的都先被改名叫一遍文曲星,更夸张的是有一段时间只要是带有LCD,下面又有很多按键的都统统叫“文曲星”,可见文曲星的广告做得一斑。共同的是perl也一斑,于是借着新鲜感打算先用perl试试,于是又从hello world开始,拼拼凑凑做完第一个页面后感觉有些丑,觉得整体感觉不太合适,也许用在其他地方会更好,于是就暂时放下换CGIlua了。和perl一样这两个都是脚本语言,都需要解释器来执行,这样相比较C编译后的可执行文件在执行时就有些慢了,不过好处是脚本不需要编译就可以直接运行了,这是它的优点也是缺点。同时将与lua有关的东西移到2410的板子上还需要改一些东西,为此还加入了一个qq群,于是又从hello world开始,整完测试页面后效果也不是很满意,还是想换。最后终于找到了一个叫cgic的,从名字就可以看出来,这是一个用c实现的cgi,毕竟在板子上运行c更爽一些,同时也免去了从hello world开始。
J"C9Q$Ub5F4TL0
T B%qX2k|0下面是对使用它的简单总结。IC开发网 T ID LRt*W
IC开发网 N%l:p {8l|
解开压缩包后主要包括以下几个文件(project那个文件夹是我自己建的,里面放的是SourceInsight创建的工程文件,看cgic源码方便些)
/|6pz!VPu)w8`w8u'j0IC开发网?9E1p#eP;a
|-- Makefile
7Y$HF B(Ds0|-- capture.cIC开发网 R^;ZX5PfS"dQ!a
|-- cgic.cIC开发网4JVh R6{EI%d!/
|-- cgic.hIC开发网R bZ t'gK(N
|-- cgic.htmlIC开发网0]lX)s#j6a }:B"NW
|-- cgic.o
8~2v ~'~ _!G*r3m*GS KY0|-- cgictest.c
R+ny2PA7`0|-- cgitest.cgi
KUZv#sF,g0|-- license.txtIC开发网9/b FA G?
|-- project
Dcxp9O j}v @0|   |-- cgic.IAB
*s/ahY8y6D*l4c0|   |-- cgic.IADIC开发网)W rh"i |
|   |-- cgic.IMBIC开发网*@hUP|9?[
|   |-- cgic.IMDIC开发网Z({ `0_:V7e:p
|   |-- cgic.PFIIC开发网,va#FfAMD$Hu1r xU[
|   |-- cgic.POIC开发网7qR8ecP)y2t?2m
|   |-- cgic.PR
UW_yK6]6~-g@0|   |-- cgic.PRI
!Rr0Nn[V5R!BU,Z0|   |-- cgic.PSIC开发网0CLy~ b-d-x J6|5}
|   |-- cgic.SearchResults
F![+xd ]0|   `-- cgic.WK3
*SJ[ Xt0LMI0|-- readme.txt
dk}mx-?Y%I2E0|-- support.txtIC开发网3r-O-K(YT%j4M
`-- svn-commit.tmpIC开发网r4jjG:r*Y|q
IC开发网K9A'/2E0^9@bD
IC开发网d0m:N1OO c h g8q
可以看到文件不多,比较简洁,其中,cgitest.c是测试文件,直接make后就会生成一个cgitest.cgi文件,把它放到sambar或是boa的cgi目录,然后运行就可以看到测试的页面了IC开发网1?-|6l vr"[
。像表单的提交,文本框,按钮的提交都有相关的接口(更多的使用还请参考帮助文档),如:IC开发网%s7X:}$LiU ~:j

5un0sr [$`G7sQ0char name_test[81];
,b Rn e:p m%e0cgiFormStringNoNewlines("name", name_test, 81);
6I ?I` c0IC开发网'C4/r+|A}/+b/s
是将html代码中为name的变量的值复制到数组name_test中,而name就是类似于我们登录论坛时在文本框中输入的用户名之类的字符串,这样就完成了与用户的交互,获得了name字符串的值并保存在name_test中,这样,在应用程序中就可以对这个name的字符串进行验证了,比如是否为合法值等。在cgic.c时,需要在自己的源文件中添加cgic.h头文件,然后将原来的main()主函数改为cgiMain()就可以用了,也就是说将原来的源文件作为cgic的一个子函数被调用。cgic的打印输出方式为fprintf(cgiOut,"test");这在cgictest.c中就可以看到:IC开发网zg!V0{&A J ?,w

c'SD'BS*b oc8a0void ShowForm()IC开发网k AYz,aR0A
{
6F4fgG6c4~? X0        fprintf(cgiOut, "<!-- 2.0: multipart/form-data is required for file uploads. -->");IC开发网2Cr/C;h'}q!b3Cj+Nu
        fprintf(cgiOut, "<form. method=/"POST/" enctype=/"multipart/form-data/" ");IC开发网;yGgf2Rci0qN
        fprintf(cgiOut, "        action=/"");
LY?wx9V9E!h0        cgiValueEscape(cgiScriptName);
7}EI;GV?f[0        fprintf(cgiOut, "/">/n");IC开发网d N.s uSN
        fprintf(cgiOut, "

/n");IC开发网 xE4/o'Ao8DCg
......IC开发网Z1Zt/^7Uw7sX`:W
        fprintf(cgiOut, "Text Field containing Plaintext/n");
(L8se h6Lhr0        fprintf(cgiOut, "

/n");
Y L /k!|/fFo0        fprintf(cgiOut, "<input type=/"submit/" name=/"saveenvironment/" value=/"Save Environment/">/n");IC开发网/v9D2q3L4}W"J$k@
        fprintf(cgiOut, "</form>/n");
%}5g4N.} m G N7I0}
(T1C2B5}(sS b/hL0IC开发网#nG/]Y6z:u"|

F(Yn[^(?0可见整个cgictest.cgi的测试页面都是通过fprintf()输出的,关于这一点,像这样的稍简单的测试页面还可以应付,当要处理的是复杂的html页面时再使用这种方法,对页面以后
;b^1E)STzR1glOQc0的维护和扩展是否方便先不说,光是把页面的html代码通过fprintf()噼里啪啦写到程序里就够人受的,除非你喜欢在键盘上欢快的耕耘,享受着手指踢踏带来的乐趣,否则只好另IC开发网Ew-b^ T|#T6G:tS.B
想它法,为此,我们可以先用网页制作工具如frontpage之类的事先设计好准备要显示的页面,然后再做个将html转换为c的接口htmltoc(),主要功能就是负责解析html文件,也就是将html代码使用fprintf()输出给浏览器,同时检测html中需要调用cgi更新变量的标识处,我们可以在这些地方用自己定义的标识符表示,比如用"$$$",当htmltoc()遇到"$$$"时就返回,并记住当前读取html文件的指针位置,以便下次接着读。
_-mc$j7K'[0如,IC开发网+Q YBVsCv

W.Zr0[bq&d0
fI7d fH+/2c(YQ0----------------test.html---------------->
M3t8~%k4U V&R+~0<html>IC开发网q#A(uX:Hx2i$}"[f
<head>
1Z6apmm|3]7~]8R0</head>IC开发网 oOZZu |`QHE/W }
.....IC开发网s7Y|2R/mW'h9U
<input type="text" name="T31" readonly size="22" style="background:#EEEEEE" value="$$$");        //文本框1IC开发网J j#R Q/#L H ]
.....IC开发网/X1E!A'G7Lb~!xR a

4P"c+[ojR.gn;u0<input type="text" name="T32" readonly size="22" style="background:#EEEEEE" value="$$$");        //文本框2IC开发网S4gjt x%V^/c
.....
`_ G$y1t3iS0
A-x(U[ Dn0j]1jB0
+@L&h1z _^0</html>
!r:{ n i1F ?qmh0
6sag Bp#`f(Z0<--------------test.html----------------
zlmu2V(Pk0
&z]y QY$d i0IC开发网9r;zZjo[
/********************************IC开发网0W3_[5n'q H@;q
*负责解析html页面
.B9wP3Of+D7?0********************************/
3G EO$vE0int htmltoc(void)IC开发网Ia8Xo6{1z,u]
{
(t+K1j5XU/xW0        //读取*.html
%C;? jJ'm)]qx0        if(遇到字符串$$$)IC开发网+RpS zR
        {
z"H3Zb;g.Yx9fv0                return 0;IC开发网TuPq"tND
        }
&Inh8tH xV0        else
M+vp8FC4o6Y5^0        {
"@_(iY/E0                //继续读使用fprintf输出html代码到浏览器IC开发网xN"`l-u`
        }IC开发网2HG"VN:qv
}
#l nyjZJ0IC开发网y$hz UN*g,{
//定义字符数组
,G7d7qPd6eC0char text_test1[64];IC开发网r8g3C^ uv
char text_test2[64];IC开发网}/f`J g

5B)xY$lP@ N0/********************************
~.O,}:EN?h$N?0*负责处理变量IC开发网 K W v |V'@+h
********************************/IC开发网 o,i gW)ww+{'WD+r
int test_handle(void)
i'o S m2Fd0{IC开发网e r q'v}~#x P+O1`cn
        //使用cgic的接口获取用户在网页上输入的文本框字符串内容;
y:m_a'_t h0        //对获取到的字符串根据需要判断处理;IC开发网0sqQi Cmt%r I
        //如简单复制:IC开发网 NGGOu
        //        text_test1=文本框1的字符串;IC开发网+G#x YZ9b U3P P^"a
        //           text_test2=文本框2的字符串;
+t*g:RBa[J3_(u0IC开发网rmZ,GQX
        //将text_test1记录到文件text_log1.txt中
t1DP)?k!eE#Gh0        //将text_test2记录到文件text_log2.txt中
xaou)B{.H J0}IC开发网F s,VLG4];OU0U

0?X1B/M+{]s0
6I4z a)bJ K0IC开发网SN1n x+w*g!_wh3nD,p

wdFI&hM1s7H%Q0/********************************
3uC+I /!/g(L'P1fF0*cgic的主函数
F,cG;GK dI0********************************/
Q(a$Qkl0int cgiMain(void)
3N}%` Ri$a eh7f0{
E v1Op'dC.m3p0        test_handle();        IC开发网3aPe%Hwmt

"B$qq$Kgm,~0        htmltoc();        //开始读
Z9y;]!f,a?0        fprintf(cgiOut,"%s",text_test1);        IC开发网q j%?}k.qUsni&n

A ipi0P&n{*q0        htmltoc();        //继续读
QGF(N0B1N;P0        fprintf(cgiOut,"%s",text_test2);
4e^6l-p9CO0IC开发网 {"[._+A3b:a
        
&V FQ0iS#F$/ o)w-[0        return 0;
I i+R1CUJm+`i'j ]u0}
j(E3C4]s,?$UGZ0
:_XV h3^s0U4US0fF0--------------------------
#G'Bs(IW-]0其中test.html文件放在boa的web目录;连同cgic.c,将使用arm-linux-gcc编译后的cgiMain放在cgi-bin目录;
h)x,Iv-y7XEm0上面的主要功能就是将页面中输入的字符串原样的回显到页面中,同时也把留言记录在文件text_log1.txt和text_log2.txt中了,比如常用的网页中的留言板就可以这样实现,或
$Z*u"uM/ y%Ze:m;~ t0是比如把*.txt文件改为*.ini的格式作为配置文件,供后台运行的应用程序读取,就可以达到从网页上更改设备运行参数的目的了。IC开发网"TJ{4_:uK
IC开发网NB%S-`i6MbH
到此,关于cgic就总结完了,下面是上面提到的相关连接,供参考。IC开发网xI0M,E?0/
cgic的链接为:IC开发网/CUv"B J$eWcK
http://www.boutell.com/cgic/
5]{!q8t.I QW0cgilua的链接为:IC开发网1LQ"WH`+o
http://www.keplerproject.org/cgilua/
$O&X3gGBU0perl的链接为:IC开发网s t.qR?y c
http://www.perl.org/
+k)@@.Ai!q#o0IC开发网*U9r.H$L1n~oH
小结一下:IC开发网j? ol2QC5mx'XGJ
1.实现cgi的方式有多种,但凭cgic的短小精悍,实在值得推荐居家旅行必备,目前的最新的版本是2.05;
r~0A$I.ZPl1Re.K*M02.觉得cgi与html页面还是分开处理要好一些;
(w:IG i+R t3A03.调试时发现点问题,好消息是问题找了,原因是cgic中有些接口的调用ms是有顺序的,改变下调用顺序就可以解决问题了;坏消息是,忘了具体是哪些接口了,不过在实际使用时如果遇到反复出问题时注意下就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值