下面是一個簡單的CGI程序,它將HTML中Form的信息直接輸出到We b瀏覽器。 # include <stdio.h> # include <stdib.h> main() { int i , n ; PRintf (″Content type: text/plain/n/n″); n=0; if(getenv(″CONTENT-LENGTH″)) n=atoi(getenv(CONTENT-LENGTH″)); for (i=0;i<n;i++) putchar(getchar()); putchar (′/n′); fflush(stdout); }
下面對此程序作一下簡要的分析。 prinft (″Content type :text/plain/n/n″); 此行通過標(biāo)準(zhǔn)輸出將字符串″Content type :text/plain/n/n″傳送給Web服務(wù)器。它是一個MIME頭信息,它告訴Web服務(wù)器隨后的輸出是以純ASCII文本的形式。請注重在這個頭信息中有兩個新行符,這是因為Web服務(wù)器需要在實際的文本信息開始之前先看見一個空行。 if (getenv(″CONTENT-LENGTH″)) n=atoi (getenv(″CONTENT-LENGTH″)); 此行首先檢查環(huán)境變量CONTENT-LENGTH是否存在。Web服務(wù)器在調(diào)用使用POST方法的CGI程序時設(shè)置此環(huán)境變量,它的文本值表示W(wǎng)eb服務(wù)器傳送給CGI程序的輸入中的字符數(shù)目,因此我們使用函數(shù)atoi() 將此環(huán)境變量的值轉(zhuǎn)換成整數(shù),并賦給變量n。請注重Web服務(wù)器并不以文件結(jié)束符來終止它的輸出,所以假如不檢查環(huán)境變量CONTENT-LENGTH,CGI程序就無法知道什么時候輸入結(jié)束了。
CGI程序產(chǎn)生的輸出由兩部分組成:MIME頭信息和實際的信息。兩部分之間以一個空行分開。我們已經(jīng)看到怎樣使用MIME頭信息″Content type :text/plain/n/n″和printf()、put char()等函數(shù)調(diào)用來輸 出純ASCII文本給Web服務(wù)器。實際上,我們也可以使用MIME頭信息″Content type :text/html/n/n″來輸出HTML源代碼給Web服務(wù)器。請注重任何MIME頭信息后必須有一個空行。一旦發(fā)送這個MIME頭信息給We b服務(wù)器后,Web瀏覽器將認(rèn)為隨后的文本輸出為HTML源代碼,在HTML源代碼中可以使用任何HTML結(jié)構(gòu),如超鏈、圖像、Form,及對其他CGI程 序的調(diào)用。也就是說,我們可以在CGI程序中動態(tài)產(chǎn)生HTML源代碼輸出 ,下面是一個簡單的例子。
#include <stdio.h> #include <string.h> main() { printf(″Contenttype:text/html/n/n″); printf(″<html>/n″); printf(″<head><title>An HTML Page From a CGI</title></h ead>/n″); printf(″<body><br>/n″); printf(″<h2> This is an HTML page generated from with i n a CGI program.. .</h2>/n″); printf(″<hr><p>/n″); printf(″<a href="../output.html#two"><b> Go back to out put.html page < /b></a>/n″); printf(″</body>/n″); printf(″</html>/n″); fflush(stdout); }