目录
CGI概念
通用网关接口(CommonGatewayInterface/CGI)是一个WEB服务器主机提供信息服务的标准接口,通过提供这样的一个标准接口,WEB服务器能执行应用程序并将它们的输出,如文字、图像、声音等传送给一个WEB浏览器。一般来说,CGI标准接口的功能就是在HTML文档与服务器应用程序之间传递信息。
1、CGI程序的通信方式
当有数据从浏览器传到WEB服务器后,该服务器会根据传送的类型是GET或者POST,将这些接收到的数据传入QUERY_STRING或变量中,CGI程序可以通过标准输入,在程序中接收这些数据。当要向浏览器发送信息时,只要向Web服务器发送 特定的文件头信息,即可通过标准输出将信息发往WEB服务器,WEB服务器处理完这些由CGI程序发来的信息后就会将这些信息发送给浏览器。
2、接收数据
用GET方式接收到的数据保存在Web服务器的QUERY_STRING变量里,而通过POST方式接收到的数据是保存在这个Web服务器变量里。它们的唯一区别就是:以GET方式接收的数据是有长度限制,而用POST方式接收的数据是没有长度限制的,所以要变量CONTENT_LENGHT来限制长度。以GET方式发送数据,可以通过URL的形式来发送,但POST方式发送的数据必须要通过Form才到发送。
参数详解
SERVER_NAME: 运行CGI序为机器名或IP地址。 SERVER_INTERFACE: WWW服务器的类型,如:CERN型或NCSA型。 SERVER_PROTOCOL: 通信协议,应当是HTTP/1.0。 SERVER_PORT: TCP端口,一般说来web端口是80。 HTTP_ACCEPT: HTTP定义的浏览器能够接受的数据类型。 HTTP_REFERER: 发送表单的文件URL。(并非所有的浏览器都传送这一变量) HTTP_USER-AGENT: 发送表单的浏览器的有关信息。 GETWAY_INTERFACE: CGI程序的版本,在UNIX下为CGI/1.1。 PATH_TRANSLATED: PATH_INFO中包含的实际路径名。 PATH_INFO: 浏览器用GET方式发送数据时的附加路径。 SCRIPT_NAME: CGI程序的路径名。 QUERY_STRING: 表单输入的数据,URL中问号后的内容。 REMOTE_HOST: 发送程序的主机名,不能确定该值。 REMOTE_ADDR: 发送程序的机器的IP地址。 REMOTE_USER: 发送程序的人名。 CONTENT_TYPE: POST发送,一般为application/xwww-form-urlencoded。 CONTENT_LENGTH: POST方法输入的数据的字节数。
服务器与浏览器之间的信息协议,你实际看不到。有三个类型的头部: Content-type, Location,和Status。Content-type最普遍的。 有关content-type解释可以见有关HTML的说明,一个你可以发出的特定编码象这样:Content-type: text/html,输出数据的类型是text/html;换句话说,是个HTML文件。
实例详解
以经典程序为例说明怎么编写C语言的CGI程序:
#include <stdio.h> int main(){ printf("Content-type:text/html\n\n"); printf("Hello,World!"); return 1; }
Content-type:text/html需要独占一行,并且下面要有个空行。这次先做个留言本,提取了bbs2www中的cgi.c和cgi.h用来编程将更简单。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define advicefile "UserAdvice.txt" main( ){ char *name="",*email=""; FILE *advicefile_fp; name="addfadfd"; email="dfdgfgf"; advicefile_fp=fopen(advicefile,"at"); fprintf(advicefile_fp,"mingzi=%s\n",name); fprintf(advicefile_fp,"emails=%s",email); } //将两个字符串放进文件,需要cgi目录可写
此次是在apache下实现,请详细配置参见/etc/httpd/conf/httpd.conf文件并且对/var/www/cgi-bin目录进行权限设置。
转载请注明:雪后西塘 » C语言实现CGI交互程序