吳兆芝
(南京曉莊學院 數學與信息技術學院,江蘇 南京 211171)
隨著計算機網絡技術及嵌入式技術的不斷發展,嵌入式系統的網絡應用已經成為嵌入式系統應用的一個重要領域,同時網絡技術也成為對嵌入式系統實施遠程管理與控制的重要手段.Web服務是當前網絡技術的一個重要分支,也是嵌入式系統使用最多的網絡技術.鑒于嵌入式系統本身的特點,對嵌入式系統的遠程管理與控制主要是通過Web服務來實現.
對絕大多數的遠程管理與控制功能而言,不僅涉及到網絡的通信,更涉及到對受控主機的信息采集或程序控制,而這些工作單靠Web服務器本身是很難完成的.解決的方法主要有兩種:一種方法是改造Web服務器使其能夠使用特定的動態網頁編程語言并用這種編程語言調用受控主機的程序完成特定的任務,典型的動態網頁語言有PHP、ASP、JSP等;另一種方法是使用公共網關接口CGI,Web服務器通過CGI接口規范調用受控主機的可執行程序.顯然,前一種方法不適合嵌入式系統使用,所以在嵌入式系統的網絡管理與控制中主要采用CGI技術實現.
本文在簡要介紹CGI的原理的基礎上,分析用C語言實現CGI的技術要點及實現方法.最后,通過一個實例演示C語言CGI在ARM平臺遠程控制中的應用.
公共網關接口CGI[1]是Web服務器的一種標準規范,用來將Web用戶的請求傳遞給服務器的應用程序,并將接收到的數據回送給Web用戶.
每當用戶向Web服務器提交一個頁面請求(例如,點擊一個超鏈接或輸入一個網站地址),Web服務器會將用戶請求的存放在服務器上的網頁返回給用戶.然而,當用戶提交一個帶有表單(form)的請求網頁時,在服務器端需要接收表單內容,必要時還要根據表單內容作必要的處理.一般來說,Web服務器并不能直接處理表單,而是把表單內容傳送給服務器的一個小型應用程序,由該程序對表單數據進行處理并回送必要的確定信息.這種在Web服務器與應用程序之間往返傳遞數據的方法或規范稱之為“公共網關接口(Common Gateway Interface)”,簡稱CGI.
公共網關接口CGI提供了一種將用戶請求頁面的數據傳遞給應用程序并從應用程序向用戶返回信息的一致性規范.該規范與服務器應用程序所使用的操作系統無關,只要操作系統具有標準輸入及標準輸出能力即可,因為Web服務器與應用程序之間的通信是通過標準輸入及標準輸出實現的.
CGI是一種通過Web服務器實現Web用戶與服務器應用程序往返傳遞數據的基本方法.使用CGI規范實現的服務器應用程序稱之為CGI程序.一般來說,能夠使用操作系統標準輸入及標準輸出功能的程序設計語言都可與CGI編程.常用的CGI編程語言有C、Perl、PHP等,甚至UNIX及Linux操作系統的Shell也可以實現CGI編程.鑒于嵌入式系統的特點,一般都使用C語言實現CGI編程.
CGI程序需要從Web服務器接收用戶信息,對該信息進行必要處理,最后返回處理結果.根據CGI規范,CGI需要完成下列任務:
接收用戶信息.用戶瀏覽器將請求頁發送給Web服務器,由Web服務器創建一個子進程,在子進程中調用CGI程序,將用戶信息傳遞給CGI程序.傳遞的方式有兩種:通過環境變量傳遞及通過標準輸入/標準輸出傳遞.
解碼用戶信息.用戶瀏覽器請求頁在向Web傳遞過程中首先被編碼,以適合于使用HTTP協議在網絡上傳送.因此,當用戶信息通過Web服務器傳遞給CGI程序后,CGI程序要對接收到的用戶信息進行解碼,將其還原成初始信息.
生成HTML網頁.CGI程序的處理結果要通過Web服務器回送給用戶瀏覽器,而用戶瀏覽器要接收的必須是HTML網頁,這就要求CGI程序能夠根據程序處理結果動態生成HTML網頁.
用C語言[2,3]實現CGI程序的編程,主要就是實現接收用戶信息、解碼用戶信息和生成HTML網頁這三項任務.
(1)Web服務器與CGI程序的通信.由于CGI應用程序是在Web服務器創建的子進程中被調用,因此二者之間的通信可以通過環境變量實現.
首先,Web服務器將一些關鍵性信息,如請求方法(GEG、POST等)、請求頁類型、用戶主機地址等設置為相應的環境變量.然后,在CGI程序中讀取這些環境變量,即可獲得Web服務器傳遞的信息.
在C語言程序中讀取環境變量,可使用getenv()函數,例如:
getenv(“CONTENT_LENGTH”),獲得表單長度.
但由于環境變量只能傳遞少量的短小信息,因此當用戶需要向CGI程序傳送大量信息時無法通過環境變量實現.
Web服務器在運行過程中采用守護進程(daemon)方式常駐內存.在創建調用CGI程序的子進程時,Web服務器在父子進程間創建兩個管道,在父進程中將標準輸入和標準輸出分別轉向到這兩個管道;在子進程中將標準輸入設備和標準輸出設備分別轉向到管道的另一端.從而使父進程的標準輸出通過管道傳送給子進程的標準輸入,同時使子進程的標準輸出轉向給父進程的標準輸入.父子進程使用各自的標準輸入及標準輸出功能通過管道實現相互通信.
Web服務器通過這種管道方式,可將用戶瀏覽器的大量數據方便地傳送給CGI程序,也可從CGI接收大量的返回數據.
例如,語句fread(form_ptr,1,i,stdin);表示CGI程序通過標準輸入(stdin)從Web服務器讀取i個字節數據,存放到緩沖區fomr_ptr中.
(2)用戶信息的解碼.根據HTTP協議的需要,用戶瀏覽器信息在傳遞過程首先要對傳遞的數據進行變換,方法有兩種:一種是將某些特定字符用另一字符替換,例如將空格符用“+”替換;另一種是將一個字符用“%XX”形式的字符串,其中XX為該字符的兩位16進制ASCII碼,例如“&”的16進制ASCII碼為0x26,所以編碼之后變成“%26”.
另外,當請求頁面的方法為“POST”時,還可以通過請求頁面傳遞多個參數,其格式為:參數1=參數值1&參數2=參數值2&參數3=參數值3…參數n=參數值n,各參數之間用“&”分隔.
CGI程序的任務是對上述編碼信息進行解碼將其還原.
典型的解碼程序如下:
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 = ' 主站蜘蛛池模板: 国产精品久久久久鬼色| 欧洲高清无码在线| 久久久久久国产精品mv| 久久综合五月| 国产成人高清亚洲一区久久| 久青草免费视频| 成人年鲁鲁在线观看视频| 亚洲不卡影院| 114级毛片免费观看| 日韩在线欧美在线| 亚洲人成影视在线观看| 青青草原国产| 日本午夜视频在线观看| 试看120秒男女啪啪免费| 人人妻人人澡人人爽欧美一区 | 国产成人三级在线观看视频| 亚洲成肉网| 一级毛片基地| 国产熟睡乱子伦视频网站| 幺女国产一级毛片| 伊人成色综合网| 欧美激情首页| 色爽网免费视频| 久久亚洲高清国产| 狠狠做深爱婷婷久久一区| 91热爆在线| 一区二区三区精品视频在线观看| 亚洲精品黄| 999福利激情视频 | 欧美怡红院视频一区二区三区| 一级全免费视频播放| 国产爽妇精品| 日本免费a视频| 欧美综合成人| 2020极品精品国产| 国产青榴视频| av在线5g无码天天| 好紧好深好大乳无码中文字幕| 日韩高清一区 | 怡红院美国分院一区二区| 国产丝袜啪啪| 精品亚洲国产成人AV| 欧美日韩午夜| 人妻无码一区二区视频| 国产精品分类视频分类一区| 国产精欧美一区二区三区| 欧美精品另类| 激情综合网址| 久久久久久久蜜桃| 91成人在线免费视频| 国产成人精品亚洲77美色| 国产va欧美va在线观看| 成人午夜网址| 国产精品视频导航| 一区二区三区精品视频在线观看| 国产精品99久久久| 国产精品成人免费视频99| 亚洲性影院| 亚洲AV无码乱码在线观看代蜜桃| 日韩专区第一页| 日韩欧美中文字幕在线精品| 日本成人一区| 青青草原偷拍视频| 国产精品久久久久久久伊一| 一本久道热中字伊人| 色视频国产| 日韩高清成人| 久夜色精品国产噜噜| 午夜限制老子影院888| 日本精品αv中文字幕| 国产黄在线免费观看| 视频在线观看一区二区| 国产91成人| 国产一二三区在线| 毛片基地视频| 亚洲AⅤ波多系列中文字幕| 国产精品区视频中文字幕| 无码专区国产精品一区| 国产打屁股免费区网站| 欧美在线三级| 华人在线亚洲欧美精品| 人人艹人人爽|