Posted on 2010-07-28 16:47
幻海藍夢 閱讀(1280)
評論(0) 編輯 收藏 所屬分類:
Linux
原文:http://blog.donews.com/mutecat/archive/2006/10/28/1068602.aspx
其實大一的時候就開始接觸CGI了,CGI(Common Gateway Interface: 公用網關接口)規定了Web服務器調用其他可執行程序(CGI程序)的接口協議標準,由此可見,CGI程序需要httpd服務器的支持。Linux下比較流行用perl和php來寫CGI程序,CGI程序需要大量的字符處理工作,perl和php對字符的處理都非常簡單。但是有時也用C語言或者其他一些語言來寫,C語言寫CGI相對比較復雜,大家知道C對字符串的處理是相當復雜的,但是用C語言編寫的CGI程序具有執行速度快、安全性高等特點。
CGI接口標準包括標準輸入、環境變量、標準輸出三部分。
綠體部分摘自http://www.7dspace.com/doc/19/2005-08-17/200581702512452703.htm
1.標準輸入
CGI程序像其他可執行程序一樣,可通過標準輸入(stdin)從Web服務器得到輸入信息,如Form中的數據,這就是所謂的向CGI程序傳遞數據的POST方法。這意味著在操作系統命令行狀態可執行CGI程序,對CGI程序進行調試。
2.環境變量
?????? 操作系統提供了許多環境變量,它們定義了程序的執行環境,應用程序可以存取它們。Web服務器和CGI接口又另外設置了自己的一些環境變量,用來向CGI程序傳遞一些重要的參數。CGI的GET方法還通過 環境變量QUERY-STRING向CGI程序傳遞Form中的數據。
3.標準輸出
CGI程序通過標準輸出(stdout)將輸出信息傳送給Web服務器。傳送給Web服務器的信息可以用各種格式,通常是以純文本或者HTML文本的形式,這樣我們就可以在命令行狀態調試CGI程序,并且得到它們的輸出。
從上面可以看出CGI獲取input的方法有兩種:環境變量(get),讀stdin(post)
下面是CGI程序設計中常常要用到的一些環境變量。
HTTP-REFERER:調用該CGI程序的網頁的URL。
REMOTE-HOST:調用該CGI程序的Web瀏覽器的機器名和域名。
REQUEST-METHOD:指的是當Web服務器傳遞數據給CGI程序時所采用的方法,分為GET和POST兩種方法。GET方法僅通過環境變量(如QUERY-STRING)傳遞數據給CGI程序,而POST方法通過環境變量和標準輸入傳遞數據給CGI程序,因此POST方法可較方便地傳遞較多的數據給CGI程序。
SCRIPT-NAME:該CGI程序的名稱。
QUERY-STRING:當使用GET方法時,Form中的數據最后放在QUERY-STRING中,傳遞給CGI程序。
CONTENT-TYPE:傳遞給CGI程序數據的MIME類型,通常為″applica tion/x-www-form-url encodede″,它是從HTML Form中以POST方法傳遞數據給CGI程序的數據編碼類型,稱為URL編碼類型。
CONTENT-LENGTH:傳遞給CGI程序的數據字符數(字節數)。
CGI處理的C語言程序大概如下:
n=atoi(getsenv("CONTENT_LENGTH"));??//獲取傳遞給程序的字節數
?if(n>5000000) n=5000000;
?buf=calloc(n+1, 1);
?if(buf==0) http_fatal("memory overflow");
?fread(buf, 1, n, stdin);????????????//從標準輸入讀取數據(post)
?buf[n]=0;
?t2=strtok(buf, "&");???????????????? //?的確是post,進行數據處理
?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);??//從環境變量里面獲取數據(get)
?t2=strtok(buf2, "&");????????????????????????????????????????????????????????? //的確是get,進行數據處理
?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