原文:http://blog.donews.com/mutecat/archive/2006/10/28/1068602.aspx
其實(shí)大一的時(shí)候就開(kāi)始接觸CGI了,CGI(Common Gateway Interface: 公用網(wǎng)關(guān)接口)規(guī)定了Web服務(wù)器調(diào)用其他可執(zhí)行程序(CGI程序)的接口協(xié)議標(biāo)準(zhǔn),由此可見(jiàn),CGI程序需要httpd服務(wù)器的支持。Linux下比較流行用perl和php來(lái)寫CGI程序,CGI程序需要大量的字符處理工作,perl和php對(duì)字符的處理都非常簡(jiǎn)單。但是有時(shí)也用C語(yǔ)言或者其他一些語(yǔ)言來(lái)寫,C語(yǔ)言寫CGI相對(duì)比較復(fù)雜,大家知道C對(duì)字符串的處理是相當(dāng)復(fù)雜的,但是用C語(yǔ)言編寫的CGI程序具有執(zhí)行速度快、安全性高等特點(diǎn)。
CGI接口標(biāo)準(zhǔn)包括標(biāo)準(zhǔn)輸入、環(huán)境變量、標(biāo)準(zhǔn)輸出三部分。
綠體部分摘自http://www.7dspace.com/doc/19/2005-08-17/200581702512452703.htm
1.標(biāo)準(zhǔn)輸入
CGI程序像其他可執(zhí)行程序一樣,可通過(guò)標(biāo)準(zhǔn)輸入(stdin)從Web服務(wù)器得到輸入信息,如Form中的數(shù)據(jù),這就是所謂的向CGI程序傳遞數(shù)據(jù)的POST方法。這意味著在操作系統(tǒng)命令行狀態(tài)可執(zhí)行CGI程序,對(duì)CGI程序進(jìn)行調(diào)試。
2.環(huán)境變量
?????? 操作系統(tǒng)提供了許多環(huán)境變量,它們定義了程序的執(zhí)行環(huán)境,應(yīng)用程序可以存取它們。Web服務(wù)器和CGI接口又另外設(shè)置了自己的一些環(huán)境變量,用來(lái)向CGI程序傳遞一些重要的參數(shù)。CGI的GET方法還通過(guò) 環(huán)境變量QUERY-STRING向CGI程序傳遞Form中的數(shù)據(jù)。
3.標(biāo)準(zhǔn)輸出
CGI程序通過(guò)標(biāo)準(zhǔn)輸出(stdout)將輸出信息傳送給Web服務(wù)器。傳送給Web服務(wù)器的信息可以用各種格式,通常是以純文本或者HTML文本的形式,這樣我們就可以在命令行狀態(tài)調(diào)試CGI程序,并且得到它們的輸出。
從上面可以看出CGI獲取input的方法有兩種:環(huán)境變量(get),讀stdin(post)
下面是CGI程序設(shè)計(jì)中常常要用到的一些環(huán)境變量。
HTTP-REFERER:調(diào)用該CGI程序的網(wǎng)頁(yè)的URL。
REMOTE-HOST:調(diào)用該CGI程序的Web瀏覽器的機(jī)器名和域名。
REQUEST-METHOD:指的是當(dāng)Web服務(wù)器傳遞數(shù)據(jù)給CGI程序時(shí)所采用的方法,分為GET和POST兩種方法。GET方法僅通過(guò)環(huán)境變量(如QUERY-STRING)傳遞數(shù)據(jù)給CGI程序,而POST方法通過(guò)環(huán)境變量和標(biāo)準(zhǔn)輸入傳遞數(shù)據(jù)給CGI程序,因此POST方法可較方便地傳遞較多的數(shù)據(jù)給CGI程序。
SCRIPT-NAME:該CGI程序的名稱。
QUERY-STRING:當(dāng)使用GET方法時(shí),Form中的數(shù)據(jù)最后放在QUERY-STRING中,傳遞給CGI程序。
CONTENT-TYPE:傳遞給CGI程序數(shù)據(jù)的MIME類型,通常為″applica tion/x-www-form-url encodede″,它是從HTML Form中以POST方法傳遞數(shù)據(jù)給CGI程序的數(shù)據(jù)編碼類型,稱為URL編碼類型。
CONTENT-LENGTH:傳遞給CGI程序的數(shù)據(jù)字符數(shù)(字節(jié)數(shù))。
CGI處理的C語(yǔ)言程序大概如下:
n=atoi(getsenv("CONTENT_LENGTH"));??//獲取傳遞給程序的字節(jié)數(shù)
?if(n>5000000) n=5000000;
?buf=calloc(n+1, 1);
?if(buf==0) http_fatal("memory overflow");
?fread(buf, 1, n, stdin);????????????//從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)(post)
?buf[n]=0;
?t2=strtok(buf, "&");???????????????? //?的確是post,進(jìn)行數(shù)據(jù)處理
?while(t2) {
??t3=strchr(t2, ‘=’);
??if(t3!=0) {
???t3[0]=0;
???t3++;
???__unhcode(t3);
???parm_add(trim(t2), t3);
??}
??t2=strtok(0, "&");
?}
?strsncpy(buf2, getsenv("QUERY_STRING"), 1024);??//從環(huán)境變量里面獲取數(shù)據(jù)(get)
?t2=strtok(buf2, "&");????????????????????????????????????????????????????????? //的確是get,進(jìn)行數(shù)據(jù)處理
?while(t2) {
??t3=strchr(t2, ‘=’);
??if(t3!=0) {
???t3[0]=0;
???t3++;
???__unhcode(t3);
???parm_add(trim(t2), t3);
??}
??t2=strtok(0, "&");
?}
參考文檔:
http://ind.ntou.edu.tw/~dada/cgi/CGIprog.htm
http://www.7dspace.com/doc/19/2005-08-17/200581702512452703.htm