基于WEB服务器CGI接口实现留言板功能

WEB服务器CGI接口功能的实现

1.什么是WEB服务器(IISNginxApache

WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。
  (1)应用层使用HTTP协议。
  (2)HTML文档格式。
  (3)浏览器统一资源定位器(URL)

2.CGI,FastCGI

CGI全称是公共网关接口”(Common Gateway Interface)HTTP服务器与你的或其它机器上的程序进行交谈的一种工具,其程序须运行在网络服务器上。

CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量

3.Web服务器和CGI的关系

Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response),例如送回一个HTML页面。为了处理一个请求(request)Web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(JavaServer Pages)脚本,servletsASP(Active Server Pages)脚本,服务器端(server-side)JavaScript,或者一些其它的服务器端(server-side)技术。无论它们的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。

   CGI留言板主要只通过html文件调用CGI程序,实现将网页输入的数据写入到文本中保存,在网页中打印出相应的数据,并可以查看文本的内容

  效果图如下:

            基于WEB服务器CGI接口实现留言板功能_第1张图片

               基于WEB服务器CGI接口实现留言板功能_第2张图片

                     基于WEB服务器CGI接口实现留言板功能_第3张图片

1.实现留言板文件写入源代码(test1.c)

#include < stdio.h > 
#include < stdlib.h > 
#define MAXLEN 80 
#define EXTRA 5 
/* 4个字节留给字段的名字"data", 1个字节留给"=" */ 
#define MAXINPUT MAXLEN+EXTRA+2 
/* 1个字节留给换行符,还有一个留给后面的NULL */ 
/* 要被添加数据的文件 */
 #define DATAFILE "D:/data.txt" //文本路径
void unencode(char *src, char *last, char *dest) 
{ 
for(; src != last; src++, dest++) 
if(*src == '+') 
*dest = ' '; 
else if(*src == '%') { 
int code; 
if(sscanf(src+1, "%2x", &code) != 1) code = '?'; 
*dest = code; 
src +=2; } 
else 
*dest = *src; 
*dest = ' '; 
*++dest = NULL; 
} 
int main(void) 
{ 
char *lenstr; 
char input[MAXINPUT], data[MAXINPUT]; 
long len; 
printf("Content-Type:text/plain;charset=gb2312 \n\n");// 
lenstr = getenv("CONTENT_LENGTH"); //获取环境变量内容(CONTENT_LENGTH为环境变量的名称)
//如果长度为零或者输入过长
if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len > MAXLEN) 
printf("表单提交错误"); 
else { 
FILE *f; 
fgets(input, len+1, stdin); //读取一串数据
unencode(input+EXTRA, input+len, data); 
f = fopen(DATAFILE, "a"); //打开文本
if(f == NULL) 
printf("对不起,意外错误,不能够保存你的数据 "); 
else 
fputs(data, f);//向指定文件写入字符串 
fclose(f); 
printf("非常感谢,您的数据已经被保存\n信息为:%s",data); 
} 
return 0; 
} 

CGI的定义中,对于POST类型的表单,其内容被送到CGI程序的标准输入,而被传送的长度被放在环境变量 CONTENT_LENGTH中。所以,在标准输入中读入CONTENT_LENGTH长度的字符串。但是,CGI程序和一般的程序有所不同,一般的程序在读完了一个文件流的内容之后,会得到一个EOF的标志。但在CGI程序的表单处理过程中,EOF是永远不会出现的,所以不要读多于 CONTENT_LENGTH长度的字符。

   程序先从CONTENT_LENGTH环境变量中得到数据的字长,然后读取相应长度的字符串。因为数据内容在传输的过程中是经过了编码的,所以必须进行相应的解码。编码的规则很简单,主要的有这几条: 
   1. 表单中每个每个字段用字段名后跟等号,再接上上这个字段的值来表示,每个字段之间的内容用&连结; 
   2. 所有的空格符号用加号代替,所以在编码码段中出现空格是非法的; 
   3. 特殊的字符比如标点符号,和一些有特定意义的字符如“+”,用百分号后跟其对应的ACSII码值来表示。 
   上面的unencode()函数就是用来把编码后的数据进行解码的。在解码完成后,数据被添加到data.txt文件的尾部,并在浏览其中回显出来

2.实现查看文件源代码(test2.c)

#include < stdio.h > 
#include < stdlib.h > 
#define DATAFILE "D:/data.txt" //文本路径
int main(void) 
{ 
FILE *f = fopen(DATAFILE,"r");//可读模式打开文本
int ch; 
if(f == NULL) { 
printf("Content-Type:text/plain;charset=gb2312 \n\n");  
printf("意外错误,无法打开文件"); } 
else { 
printf("Content-Type:text/plain \n\n"); //文本形式打印
while((ch=getc(f)) != EOF) 
putchar(ch); //通过循环打印每个字符
fclose(f); } 
return 0; 
} 

数据直接作为简单文本(plain text)输出,只需text/plain类型代替text/html就可以了,浏览器会根据Content-Type的类型自动的选择 相应的处理方法。


另:表单文件(test1.html)(写入 — 查看)

请输入您的留言(最多80个字符):

 

 

3.流程:

首先需要配置Apache软件,在配置文件中(httpd.conf)设置好CGI的文件路径(如:C:\wamp\www\cgi-bin),如图: 基于WEB服务器CGI接口实现留言板功能_第4张图片

     将两个.c文件在vs2010下编译后,生成exe可执行文件,将文件放置在配置好的路径中,然后在表单的ACTION填写文件的相对路径(

你可能感兴趣的:(C)