吳兆芝
(南京曉莊學(xué)院 數(shù)學(xué)與信息技術(shù)學(xué)院,江蘇 南京 211171)
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)及嵌入式技術(shù)的不斷發(fā)展,嵌入式系統(tǒng)的網(wǎng)絡(luò)應(yīng)用已經(jīng)成為嵌入式系統(tǒng)應(yīng)用的一個(gè)重要領(lǐng)域,同時(shí)網(wǎng)絡(luò)技術(shù)也成為對(duì)嵌入式系統(tǒng)實(shí)施遠(yuǎn)程管理與控制的重要手段.Web服務(wù)是當(dāng)前網(wǎng)絡(luò)技術(shù)的一個(gè)重要分支,也是嵌入式系統(tǒng)使用最多的網(wǎng)絡(luò)技術(shù).鑒于嵌入式系統(tǒng)本身的特點(diǎn),對(duì)嵌入式系統(tǒng)的遠(yuǎn)程管理與控制主要是通過(guò)Web服務(wù)來(lái)實(shí)現(xiàn).
對(duì)絕大多數(shù)的遠(yuǎn)程管理與控制功能而言,不僅涉及到網(wǎng)絡(luò)的通信,更涉及到對(duì)受控主機(jī)的信息采集或程序控制,而這些工作單靠Web服務(wù)器本身是很難完成的.解決的方法主要有兩種:一種方法是改造Web服務(wù)器使其能夠使用特定的動(dòng)態(tài)網(wǎng)頁(yè)編程語(yǔ)言并用這種編程語(yǔ)言調(diào)用受控主機(jī)的程序完成特定的任務(wù),典型的動(dòng)態(tài)網(wǎng)頁(yè)語(yǔ)言有PHP、ASP、JSP等;另一種方法是使用公共網(wǎng)關(guān)接口CGI,Web服務(wù)器通過(guò)CGI接口規(guī)范調(diào)用受控主機(jī)的可執(zhí)行程序.顯然,前一種方法不適合嵌入式系統(tǒng)使用,所以在嵌入式系統(tǒng)的網(wǎng)絡(luò)管理與控制中主要采用CGI技術(shù)實(shí)現(xiàn).
本文在簡(jiǎn)要介紹CGI的原理的基礎(chǔ)上,分析用C語(yǔ)言實(shí)現(xiàn)CGI的技術(shù)要點(diǎn)及實(shí)現(xiàn)方法.最后,通過(guò)一個(gè)實(shí)例演示C語(yǔ)言CGI在ARM平臺(tái)遠(yuǎn)程控制中的應(yīng)用.
公共網(wǎng)關(guān)接口CGI[1]是Web服務(wù)器的一種標(biāo)準(zhǔn)規(guī)范,用來(lái)將Web用戶的請(qǐng)求傳遞給服務(wù)器的應(yīng)用程序,并將接收到的數(shù)據(jù)回送給Web用戶.
每當(dāng)用戶向Web服務(wù)器提交一個(gè)頁(yè)面請(qǐng)求(例如,點(diǎn)擊一個(gè)超鏈接或輸入一個(gè)網(wǎng)站地址),Web服務(wù)器會(huì)將用戶請(qǐng)求的存放在服務(wù)器上的網(wǎng)頁(yè)返回給用戶.然而,當(dāng)用戶提交一個(gè)帶有表單(form)的請(qǐng)求網(wǎng)頁(yè)時(shí),在服務(wù)器端需要接收表單內(nèi)容,必要時(shí)還要根據(jù)表單內(nèi)容作必要的處理.一般來(lái)說(shuō),Web服務(wù)器并不能直接處理表單,而是把表單內(nèi)容傳送給服務(wù)器的一個(gè)小型應(yīng)用程序,由該程序?qū)Ρ韱螖?shù)據(jù)進(jìn)行處理并回送必要的確定信息.這種在Web服務(wù)器與應(yīng)用程序之間往返傳遞數(shù)據(jù)的方法或規(guī)范稱之為“公共網(wǎng)關(guān)接口(Common Gateway Interface)”,簡(jiǎn)稱CGI.
公共網(wǎng)關(guān)接口CGI提供了一種將用戶請(qǐng)求頁(yè)面的數(shù)據(jù)傳遞給應(yīng)用程序并從應(yīng)用程序向用戶返回信息的一致性規(guī)范.該規(guī)范與服務(wù)器應(yīng)用程序所使用的操作系統(tǒng)無(wú)關(guān),只要操作系統(tǒng)具有標(biāo)準(zhǔn)輸入及標(biāo)準(zhǔn)輸出能力即可,因?yàn)閃eb服務(wù)器與應(yīng)用程序之間的通信是通過(guò)標(biāo)準(zhǔn)輸入及標(biāo)準(zhǔn)輸出實(shí)現(xiàn)的.
CGI是一種通過(guò)Web服務(wù)器實(shí)現(xiàn)Web用戶與服務(wù)器應(yīng)用程序往返傳遞數(shù)據(jù)的基本方法.使用CGI規(guī)范實(shí)現(xiàn)的服務(wù)器應(yīng)用程序稱之為CGI程序.一般來(lái)說(shuō),能夠使用操作系統(tǒng)標(biāo)準(zhǔn)輸入及標(biāo)準(zhǔn)輸出功能的程序設(shè)計(jì)語(yǔ)言都可與CGI編程.常用的CGI編程語(yǔ)言有C、Perl、PHP等,甚至UNIX及Linux操作系統(tǒng)的Shell也可以實(shí)現(xiàn)CGI編程.鑒于嵌入式系統(tǒng)的特點(diǎn),一般都使用C語(yǔ)言實(shí)現(xiàn)CGI編程.
CGI程序需要從Web服務(wù)器接收用戶信息,對(duì)該信息進(jìn)行必要處理,最后返回處理結(jié)果.根據(jù)CGI規(guī)范,CGI需要完成下列任務(wù):
接收用戶信息.用戶瀏覽器將請(qǐng)求頁(yè)發(fā)送給Web服務(wù)器,由Web服務(wù)器創(chuàng)建一個(gè)子進(jìn)程,在子進(jìn)程中調(diào)用CGI程序,將用戶信息傳遞給CGI程序.傳遞的方式有兩種:通過(guò)環(huán)境變量傳遞及通過(guò)標(biāo)準(zhǔn)輸入/標(biāo)準(zhǔn)輸出傳遞.
解碼用戶信息.用戶瀏覽器請(qǐng)求頁(yè)在向Web傳遞過(guò)程中首先被編碼,以適合于使用HTTP協(xié)議在網(wǎng)絡(luò)上傳送.因此,當(dāng)用戶信息通過(guò)Web服務(wù)器傳遞給CGI程序后,CGI程序要對(duì)接收到的用戶信息進(jìn)行解碼,將其還原成初始信息.
生成HTML網(wǎng)頁(yè).CGI程序的處理結(jié)果要通過(guò)Web服務(wù)器回送給用戶瀏覽器,而用戶瀏覽器要接收的必須是HTML網(wǎng)頁(yè),這就要求CGI程序能夠根據(jù)程序處理結(jié)果動(dòng)態(tài)生成HTML網(wǎng)頁(yè).
用C語(yǔ)言[2,3]實(shí)現(xiàn)CGI程序的編程,主要就是實(shí)現(xiàn)接收用戶信息、解碼用戶信息和生成HTML網(wǎng)頁(yè)這三項(xiàng)任務(wù).
(1)Web服務(wù)器與CGI程序的通信.由于CGI應(yīng)用程序是在Web服務(wù)器創(chuàng)建的子進(jìn)程中被調(diào)用,因此二者之間的通信可以通過(guò)環(huán)境變量實(shí)現(xiàn).
首先,Web服務(wù)器將一些關(guān)鍵性信息,如請(qǐng)求方法(GEG、POST等)、請(qǐng)求頁(yè)類型、用戶主機(jī)地址等設(shè)置為相應(yīng)的環(huán)境變量.然后,在CGI程序中讀取這些環(huán)境變量,即可獲得Web服務(wù)器傳遞的信息.
在C語(yǔ)言程序中讀取環(huán)境變量,可使用getenv()函數(shù),例如:
getenv(“CONTENT_LENGTH”),獲得表單長(zhǎng)度.
但由于環(huán)境變量只能傳遞少量的短小信息,因此當(dāng)用戶需要向CGI程序傳送大量信息時(shí)無(wú)法通過(guò)環(huán)境變量實(shí)現(xiàn).
Web服務(wù)器在運(yùn)行過(guò)程中采用守護(hù)進(jìn)程(daemon)方式常駐內(nèi)存.在創(chuàng)建調(diào)用CGI程序的子進(jìn)程時(shí),Web服務(wù)器在父子進(jìn)程間創(chuàng)建兩個(gè)管道,在父進(jìn)程中將標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出分別轉(zhuǎn)向到這兩個(gè)管道;在子進(jìn)程中將標(biāo)準(zhǔn)輸入設(shè)備和標(biāo)準(zhǔn)輸出設(shè)備分別轉(zhuǎn)向到管道的另一端.從而使父進(jìn)程的標(biāo)準(zhǔn)輸出通過(guò)管道傳送給子進(jìn)程的標(biāo)準(zhǔn)輸入,同時(shí)使子進(jìn)程的標(biāo)準(zhǔn)輸出轉(zhuǎn)向給父進(jìn)程的標(biāo)準(zhǔn)輸入.父子進(jìn)程使用各自的標(biāo)準(zhǔn)輸入及標(biāo)準(zhǔn)輸出功能通過(guò)管道實(shí)現(xiàn)相互通信.
Web服務(wù)器通過(guò)這種管道方式,可將用戶瀏覽器的大量數(shù)據(jù)方便地傳送給CGI程序,也可從CGI接收大量的返回?cái)?shù)據(jù).
例如,語(yǔ)句fread(form_ptr,1,i,stdin);表示CGI程序通過(guò)標(biāo)準(zhǔn)輸入(stdin)從Web服務(wù)器讀取i個(gè)字節(jié)數(shù)據(jù),存放到緩沖區(qū)fomr_ptr中.
(2)用戶信息的解碼.根據(jù)HTTP協(xié)議的需要,用戶瀏覽器信息在傳遞過(guò)程首先要對(duì)傳遞的數(shù)據(jù)進(jìn)行變換,方法有兩種:一種是將某些特定字符用另一字符替換,例如將空格符用“+”替換;另一種是將一個(gè)字符用“%XX”形式的字符串,其中XX為該字符的兩位16進(jìn)制ASCII碼,例如“&”的16進(jìn)制ASCII碼為0x26,所以編碼之后變成“%26”.
另外,當(dāng)請(qǐng)求頁(yè)面的方法為“POST”時(shí),還可以通過(guò)請(qǐng)求頁(yè)面?zhèn)鬟f多個(gè)參數(shù),其格式為:參數(shù)1=參數(shù)值1&參數(shù)2=參數(shù)值2&參數(shù)3=參數(shù)值3…參數(shù)n=參數(shù)值n,各參數(shù)之間用“&”分隔.
CGI程序的任務(wù)是對(duì)上述編碼信息進(jìn)行解碼將其還原.
典型的解碼程序如下:
void decode(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 = ' 泸州市| 宣威市| 修水县| 佛山市| 钦州市| 新晃| 日喀则市| 喀什市| 龙南县| 安达市| 清新县| 德令哈市| 天台县| 若羌县| 吉林省| 海兴县| 阳江市| 苍溪县| 郎溪县| 贵南县| 廊坊市| 景德镇市| 台江县| 景东| 杭州市| 颍上县| 长沙市| 蓬莱市| 江永县| 无棣县| 寿宁县| 衡阳县| 涟水县| 繁昌县| 颍上县| 林周县| 井研县| 万年县| 新巴尔虎右旗| 老河口市| 合阳县|