原创文章,转载请注明转载字样和出处,谢谢!
网页编程对我来说特别亲切,因为我就是从html、ASP、PHP一步步接触编程的。自己的编程爱好也是从那里一点一点被满足。不过离开大学之后很久没有碰过WEB了,最近看到嵌入式中的涉及到的web服务器,了解到了CGI编程,就想赶紧试一试。对于cgi,不算接触,但是还是听说过之前,对于纯粹写普通网站的人来说CGI却是很古老的东西了,之前在大学的时候学校的ftp搜索引擎,是一位特别牛b的学长写的,用的就是C实现CGI。后来我也想做一个,但是由于水平有限,后来也就不了了之。前几天在南图想找本关于CGI方面的书竟然都下架了,在网上搜索关于这方面的文章页很少,且很多是针对perl语言的,所以这里针对C语言的CGI写点东西。
嵌入式中的WEB服务器,由于嵌入式中主要是用C语言来实现,所以这里只谈C语言的CGI,而在嵌入式中的WEB服务器,大家一般选用BOA等,这里为什么选用IIS,主要是因为我们大部分人都是在windows下开发,所以在iis下调试自然是更方便一些。在网上看到很多人在问iis下配置关于C语言的CGI的方法,而网上的全部都是关于Perl的。我经过了两天的时间在网上一遍一遍的百度和摸索,终于试出来基于windows xp的IIS5.1和windows 7的IIS6.1上的CGI配置方法。
综述: 关于脚本和可执行程序
在iis中对于动态语言会设计到脚本和可执行程序。对于脚本是需要另外的程序对其进行解释的,例如perl脚本编写的CGI就是脚本,需要安装专门的程序区解释;而对于可执行程序,例如C语言编写的.cgi(是c语言编译出来的.exe程序,将扩展名exe改成cgi),其本身就是可执行程序,不需要另外的程序去解释,所以网上关于使用TC还是VC的编译器cl.exe作为可执行程序去配置c语言编写出来的cgi的说法都是错误的。其实CGI的实现就是将本身脚本或者可执行程序的标准输出,不再是通过屏幕打印,而是经过浏览器输出给客户端显示,所以你用一个vc或者tc的编译器去执行一个.exe的可执行文件是得不到想要的输出的。正确的作法是不需要和perl语言一样配置解释程序,而是配置为让文件执行。
具体操作:
由于网上针对IIS 和C语言的CGI的内容较少,所以下面的内容一步步用图片说明。方便向我一样的初次使用者。
1.编写CGI程序。
使用任何一种C语言开发工具,TC,VC,C-free均可,C/C++均可。内容我们还是使用经典的hello world。
/**************************** hello.cpp
使用C++实现的CGI输出hello world!
by kikilizhm *****************************/ #include <iostream.h> void main() { cout<<"Content-type:text/html\n\n"<<endl; /* 注意这里一定要按照这种格式,表示http头以供浏览器识别,后面的\n\n是http中要求的头和后面的内容必须空一格, 而且必须使用反斜杠,不能使用" /n/n " ,这样会报错的,无法识别。 */ cout<<"Hello World!"<<endl; }
/********************************hello.c*************** 使用C语言实现的CGI输出加粗的hello world! by kikilizhm ******************************************************/ #include <stdio.h> int main() { printf("Content-type:text/html"); printf("\n\n"); printf("<b>Hello World!</b>"); }
现在我们的cgi程序就写好了,下面我们开始配置iis,看看效果。
2.针对windows xp 的IIS5.1的配置。其实配置很简单,只要大家看明白其中的根本。
说明:这里默认IIS已经安装好可用(具体安装IIS的方法可以百度一下,这里不细说),针对iis5.1我们需要的只是配置一下脚本和可执行文件的执行权限即可。
按照上面说的,exe文件不需要解释程序,直接执行即可。假设我们网站根目录www下cgi目录为脚本存放目录,我们把hello.cgi文件放到cgi目录下,这里为演示方便,正常情况下考虑安全等因素,常将存放脚本的目录使用虚拟目录挂接,不直接放在网站根目录下。
然后我们在IIS中右击cgi目录,选择属性,打开cgi属性对话框,目录权限设置中将 读取、写入、目录访问前的勾去掉。其中读取是防止在访问cgi程序时,浏览器将cgi文件作为下载文件弹出下载对话框,而不是实际执行显示在浏览器上。写入和目录访问时安全需要。这里特别注意去掉读取权限。
然后将下方的 ”执行权限“更改为 ”脚本和可执行文件“ ,这里也是重要的一步,不可以用纯脚本,一定要有可执行文件权限。点击确认再确认,重启IIS即可。
走到这里我们打开浏览器,输入 http://localhost/cgi/hello.cgi ,即可看到hello world的画面,如果还看不到或者出现其他提示错误,一般为网站的访问权限认证设置有问题,可以尝试修改文件夹访问权限。
**********************************分割线 ====针对win 7 的IIS6.1的配置*******************************************
3.win7中的IIS界面和windows xp 中的IIS5.1界面发生了很大的变化,IIS 6.1中已经内置有CGI处理模块,这里我们直接使用即可。
同样这里我们假设我们IIS6.1已经安装好,而且可以使用,新建网站cgi-test,根目录为www,下面有子目录cgi用于存放cgi脚本文件。
在左侧的cgi-test网站中,我们单击cgi-test网站的cgi目录,右侧会显示cgi主页,我们在右侧 IIS 部分双击模块,进入模块功能,可以看到CgiModule模块,我们接下来就是要使用的这个模块来实现我们的cgi功能。
看到这里,我们返回cgi目录的主页,双击CGI主页中的”处理程序映射“来配置 cgi文件的映射,在处理程序映射界面,每一条配置的路径相当于配置的文件扩展名,
状态为已启用或者禁用,处理程序即相应的模块或者脚本解释程序。 在最右侧的操作界面,我们可以看到我们可以选择的操作,其中包括 添加托管处理程序、添加脚本映射、添加通配符脚本映射,添加模块映射,和下面的编辑功能权限等。这里我们使用的是添加模块映射和编辑功能权限。
单击添加模块映射,在出现的编译模块映射对话框中,按照如图所示配置,请求路径输入 *.cgi ,表示cgi格式文件,模块选择CgiModule,可执行文件为空,名称可以随便写,这里为cgi-exe。确定后,增加了cgi-exe配置,然后右击这条配置选择编译功能权限,确保有执行权限,然后重启iis服务。在浏览器中输入地址,即可查看到hello world的打印。
看看我们的成果吧,这里只是打印了最简单的字符,服务器已经配置好了,大家可以发挥自己的聪明才智,实现自己的功能吧~
总结:
经过大概两天的时间,终于摸索出了在iis上配置C语言编写的CGI的方法,其实真正配置下来,花的时间并不多也不复杂,但是由于网上很少人使用iis做C的cgi的服务器,而且网上关于这类问题的回答都是答非所问,甚至是错误的说法,所以摸索起来很困难,但是这两天的时间里,在经历了从最初的没有头绪,到最后的思考网上很多人在说的perl语言的cgi和c语言的cgi的区别,去甄别那些错误的信息,并且从那些错误的信息里找出来对我又帮助的地方,比如刚开始的时候使用vc的编译器cl.exe去执行,并没有得到想要的结果,于是去尝试vc的bin目录下的其他程序,在有的程序返回了一部分字符的时候,在浏览器的错误信息里显示了错误的http头,比之前的空的头还是有点帮助,毕竟有了显示,虽然是个错误信息。然后尝试着用cmd.exe去执行,最后的最后确信不适用程序去执行,后面会出现访问cgi的时候出现下载的问题,用文本方式打开下载的文件,虽然也是和服务器端一样的名称,但是下载的文件内容已经是个文本,里面就是执行打印出来的信息,只是它被下载下来了,而不是在浏览器中显示,后来在网上看到了一个朋友发的msdn社区上的说明,需要去掉读取权限,这才恍然大悟。然后就看到了亲切的打印信息了。
即使一个一开始不明白或者没有涉及到的问题,不断的去想解决它,即使没有进展,但是对于你对问题的理解还是有很大帮助的,我想这和那种做梦发现苯环之类的是一样的道理。同时也是一种学习的方式,对于一种技术一下子接受不了的时候,可以先看一部分,了解一下,或者强迫自己先学,然后放置一段时间,再回头在学,就会发现很轻松了。
该睡觉了,希望这里能对大家起到帮助作用,另外,在使用的过程中,推荐大家使用合适的环境,比如在apache中配置cgi更加的简单和安全。针对IIS上的C语言的CGI主要是针对大家在调试过程中使用。