前言
对于设计网页搞web应用的工程师来说CGI技术算是一门非常古老的技术了!为什么研究它,古老的技术一般较现在流行的技术简单,例如CGI较asp或php等等。最近一直迷恋嵌入式web技术,就是使用RAM和ROM较小的单片机做网页服务器,这些单片机可能是AVR也可能是STM32。网上的资料也不少,但是都是你抄我的或是我抄你的,很多问题都没有讲透。我借博客的技术把一些资料梳理一下!
嵌入式WEB服务技术较真正的WEB技术有以下区别。(非专业WEB人员,专业词汇说的不对请指正)
1.使用CGI来实现动态网页,而不是ASP或PHP。
2.表单多使用GET方法,而真WEB多使用POST方法,嵌入式WEB通过URL传递数据,这样方便简单。
本文的目标就是写一个最简单的CGI程序,并在网页中运行。
IIS设置
由于CGI为可执行文件,所有还需要对IIS做适当的设置。具体的设置如图1所示。
图1 IIS设置
编写Hello World程序
学习一门编程类的技术,最简单的方法莫过与实现Hello World。我参考了Getting Started with CGI Programming in C代码,并做了适当的修改。具体代码如下:
- #include <stdio.h>
- int main(void) {
- printf("Content-Type: text/plain;charset=us-ascii\n\n");
- printf("Hello world\r\n");
- return 0;
- }
#include <stdio.h>
int main(void) {
printf("Content-Type: text/plain;charset=us-ascii\n\n");
printf("Hello world\r\n");
return 0;
}
在VS2010中编译了该代码,生成了某个exe文件,例如TestCGI.exe文件。接着把TestCGI.exe文件重命名为TestCGI.cgi文件,并复制到web目录即可。在这里第一条printf语句输出一个http响应头,http响应头和具体内容之间必须包含一个空行,通过多次实验发现\n\n可以,\n也可以,但是\r\n却不可以。
图 HTTP响应 Hex格式
耐心分析过后,发送在发送\n时,CIG程序自动添加了一个\r。即为图中的0x0d和0x0A。若存在\n\n,那么相当于连续打印两个空行。在HTTP请求和响应格式中,请求头和内容之间只包含一空行即可。
其中Content指内容类型,它包含很多参数,具体可以参考维基百科相关网页。
text/plaint 表示纯文本
charset=us-ascii 表示定义字符集
运行结果
在浏览器中输入http://localhost/TestCGI.cgi/或者本机的局域网IP地址,即可在网页中看到Hello World。
请注意,URL的最后为/。
图 运行结果
从这些代码和操作步骤来看,CGI技术虽然非常古老,但是也非常的简单。
后续计划
使用GET方法传递参数,利用CGI程序实现一个乘法运算。