一、cgi標準輸入、環境變數、標準輸出
1、標準輸入
cgi程式的標準輸入是與web伺服器的標準輸出對應的,看起來就像其他可執行程式一樣通過標準輸入(stdin)得到輸入資訊,實則這些資料是由瀏覽器傳遞給伺服器後再由伺服器定向到cgi的輸入中的,如form表單中的資料,這就是所謂的web瀏覽器通過web伺服器與cgi後台可執行程式進行資訊互動的方法。這也意味著在作業系統命令列狀態可執行cgi程式,對cgi程式進行除錯。對於cgi來說資料傳輸方法分為post和get方法。
2、環境變數
作業系統提供了許多環境變數,它們定義了程式的執行環境,應用程式可以訪問它們。web伺服器和cgi介面又另外設定了自己的一些環境變數,用來向cgi程式傳遞一些重要的引數。cgi的get
方法就是通過環境變數query-string向cgi程式傳遞form中的資料的。
下面是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程式。
方法的cgi程式時設定此環境變數,它的文字值表示web 伺服器傳送給cgi程式的輸入中的字元數目,因此我們使用函式atoi() 將此環境變數的值轉換成整數,並賦給變數n。請注意web伺服器並不以檔案結束符來終止它的輸出,所以如果不檢查譔環境變數,cgi程式就無法知道什麼時候輸入結束。
在c語言程式中,要訪向環境變數,可使用getenv()庫函式。
例如:
if (getenv (″content-length″))
n=atoi(getenv (″content-length″));
請注意程式中最好呼叫兩次
getenv():第一次檢查該環境變數是否存在,第二次再使用該環境變數。這是因為函式getenv()在給定的環境變數名不存在時,返回乙個null(空)指標,如果你不首先檢查而直接引用它,當該環境變數不存在時會引起cgi程式崩潰。
3、標準輸出
cgi程式通過標準輸出(stdout)將輸出資訊傳送給web伺服器,cgi的標準輸出對應的是web伺服器的標準輸入。傳送給web伺服器的資訊可以用各種格式,通常是以純文字或者html文字的形式,這樣我們就可以在命令列狀態除錯cgi程式,並且得到它們的輸出。
cgi程式產生的輸出由兩部分組成:mime頭資訊和實際的資訊。兩部分之間以乙個空行分開。請注意任何
mime
頭資訊後必須有乙個空行。
如:prinft (″content type :text/plain%d%d″,10, 10);
此行通過標準輸出將字串[″contenttype :text/plain%d%d″, 10, 10]傳送給web伺服器。它是乙個mime頭資訊,它告訴web伺服器隨後的輸出是以純ascii文字的形式。請注意在這個頭資訊中有兩個換行符,這是因為web伺服器需要在實際的文字資訊開始之前先看見乙個空行。
一旦傳送這個mime頭資訊給web伺服器後,web瀏覽器將認為隨後的文字輸出為html源**,在html源**中可以使用任何html結構,如超鏈、影象、form,及對其他cgi程式的呼叫。也就是說,我們可以在cgi程式中動態產生html源**。
簡單例項參考:
二、cgi程式資料處理的一般工作流程。
1.通過檢查環境變數request-method確定客戶端所使用的資料傳遞方法,post還是get方法。
2.通過檢查環境變數content-length,確定有多少輸入;
3.從相應環境變數中或標準輸入中得到所有的使用者資料;
4.以相應的方法處理輸入資料,如解碼使用者資料以提取所需資訊、儲存資料以更新配置檔案等等;
5.通過″contenttype:″頭資訊,將輸出資訊的格式告訴web伺服器;
6.通過使用printf()或者putchar()或者其他的檔案寫函式,將輸出傳送給web伺服器。
cgi程式的主要任務就是從web伺服器得到輸入資訊,進行處理,然後將輸出結果再送回給web伺服器。
三、cgi中from表單資料的分析和解碼
當使用者提交乙個htmlform時,web瀏覽器首先對form中的資料以名字/值對的形式進行編碼,並傳送給web伺服器,然後由web伺服器傳遞給cgi程式。
url編碼規則:每對name/value由&符分開;每對來自表單的name/value由「=」符分開。如果使用者沒有輸入值給這個name,那麼這個name還是出現,只是無值。任何特殊的字元(就是那些不是簡單的七位ascii,如漢字)將以百分符%用十六進製制編碼,當然也包括象 =、&、% 這些特殊的字元。其實url編碼就是乙個字元ascii碼的十六進製制。不過稍微有些變動,需要在前面加上「%」。比如「\」,它的ascii碼是92,92的十六進製制是5c,所以「\」的url編碼就是%5c。那麼漢字的url編碼呢?很簡單,看例子:「胡」的ascii碼是-17670,十六進製制是bafa,url編碼是「%ba%fa」。編碼後資料格式如下:
name1=value1&name2=value2&name3=value3&name4=value4&...
其中name是form中定義的input、select或textarea等標置(tag)名字,value是使用者輸入或選擇的設定值。程式中需要對編碼後的資料進行分析和解碼。要分析這種資料流,cgi程式必須首先將資料流分解成一組組的名字/值對。這可以通過在輸入流中查詢下面的兩個字元來完成:
每當找到字元「=」,標誌著乙個form變數名字的結束;每當找到字元「&」,標誌著乙個form變數值的結束。請注意輸入資料的最後乙個變數的值不以「&」結束。
一旦「名字/值對」分解後,還必須將輸入中的一些特殊字元轉換成相應的ascii字元。這些特殊字元是:
+:將「+」轉換成空格符;
%xx:用其十六進製制ascii碼值表示的特殊字元。根據值xx將其轉換成相應的ascii字元。
gdbserver除錯cgi小結
這兩天題目中所述問題糾結的不輕,欣慰的是終於解決,在此記錄一下。一 gdbserver移植 環境pc linux version 2.6.32 431.17.1.el6.x86 64 gcc version 4.4.7 arm linux gcc version 4.4.3 arm linux ve...
CGI程式設計 CGI環境變數
web伺服器和cgi fastcgi程式之間交流資訊的主要途徑是環境變數 以及標準輸入輸出流 這裡說的環境變數是指作業系統中的環境變數。windows系統下,path是很常見的乙個環境變數 cgi規範對cgi程式中使用的環境變數名稱及其含義做了具體而明確的規定,通常把這些環境變數成為 cgi環境變數...
CGI程式設計教程 二
cgi教程第七章 上傳檔案是建立互動式 的乙個重要手段。一般來說,考慮到cgi程式的安全和一些敏感問題,伺服器是不會輕易開放檔案上傳權利的。今天的程式是由website1.1附帶的乙個upload.exe程式,由vb編寫而成。所以我要講的也就是vb寫win cgi時候的一些問題。vb寫win cgi...