嵌入式Linux系統CGI程式設計技術

2021-08-02 12:47:50 字數 3657 閱讀 6994

1 概述

隨著網際網路應用的普及,越來越多的資訊化產品需要接入網際網路通過web頁面進行遠端訪問。嵌入式web系統提供了一種經濟、實用的網際網路嵌入式接入方案。這裡結合一種嵌入式web server boa來介紹嵌入式linux系統下的cgi程式設計技術。

2 web server boa的實現與配置

2.1 uclinux下,主要有三個web server:httpd、thttpd和boa。httpd是最簡單的乙個web server,它的功能最弱,不支援認證,不支援cgi。thttpd和boa都支援認證、cgi等,功能都比較全。boa是乙個單任務的小型http伺服器,源**開放、效能優秀,特別適合應用在嵌入式系統中。目前的uclinux的**中已經包含boa的源**。在uclinux下實現boa,只需要對boa做一些配置和修改。以下是配置的過程。

(1)編譯boa到核心

(2)編制配置檔案boa.conf

在linux作業系統下,應用程式的配置都是以配置檔案的形式提供的,一般都是放在目標板/etc/目錄下或者/etc/config目錄下。但boa的配置檔案boa.cont一般都旋轉在目標板/home/httpd/目錄下。

例如,乙個典型的boa.conf檔案格式如下:

它指定了html頁面必須放到/home/httpd目錄下,cgi外部擴充套件程式必須放到/home/httpd/cgi-bin目錄下。

(3)編譯燒寫核心

重新編譯核心後,通過燒寫工具燒寫核心,就可以在pc上通過ie瀏覽器訪問開發板上的web server。例如,輸入開發板的ip位址即可訪問到自己做的網頁index.html了。並且,通過編寫cgi外部擴充套件程式,可以實現動態web技術,下面將詳細介紹。

2.2 具有mmu平台的linux下b0a的實現與配置

cc=/linuxppc/cdk/bin/powerpc-linux-gcc

cpp=/linuxppc/cdk/bin/powerpc-linux-g++

然後直接在boa/src目錄下執行make,即可生成boa可執行檔案;將其編譯入核心,並燒寫到儲存裝置,就可以實現訪問boa伺服器。

3 cgi程式設計技術

cgi(common gateway inte***ce)是外部應用擴充套件應用程式與www伺服器互動的乙個標準介面。按照cgi標準編寫的外部擴充套件應用程式可以處理客戶端瀏覽器輸入的資料,從而完成客戶端與伺服器的互動操作。而cgi規範就定義了web伺服器如何向擴充套件應用程式傳送訊息,在收到擴充套件應用程式的資訊後又如何進行處理等內容。通過cgi可以提供許多靜態的html網頁無法實現的功能,比如搜尋引擎、基於web的資料庫訪問等等。

3.1 工作原理

(1)www和cgi的工作原理

http協議是www的基礎,它基於客戶/伺服器模型,乙個伺服器可以為分布在網路中處的客戶提供服務;它是建立在tcp/ip協議之上的「無連線」協議,每次連線只處理乙個請求。在伺服器上,執行產著乙個守護程序對埠進行監聽,等待來自客戶的請求。當乙個請求到來時,將建立乙個子程序為使用者的連線服務。根據請求的不同,伺服器返回html檔案或者通過cgi呼叫外部應用程式,返回處理結果。伺服器通過cgi與外部程式和指令碼之間進行互動,根據客戶端在進行請求時所採取的方法,伺服器會收集客戶所提供的資訊,並將該部分資訊傳送給指定的cgi擴充套件程式。cgi擴充套件程式進行資訊處理並將結果返回伺服器,然後伺服器對資訊進行分析,並將結果傳送回客戶端。

外部cgi程式與www伺服器進行通訊、傳遞有關引數和處理結果是通過環境變數、命令列引數和標準輸入來進行的。伺服器提供了客戶端(瀏覽器)與cgi擴充套件程式之間的資訊交換的通道。cgi的標準輸入是伺服器的標準輸出,而cgi的標準輸出是伺服器的標準輸入。客戶的請求通過伺服器的標準輸出傳送給cgi的標準輸入,cgi對資訊進行處理後,將結果傳送到它的標準輸入,然後由伺服器將處理結果傳送給客戶端。

(2)url編碼

客戶端瀏覽器向伺服器傳送資料採用編碼的形式進行。該編碼就是crl編碼。編碼的主要工作是表單域的名字和值的轉義,具體的做法為:每一對域和值裡的空格都會被替換為乙個加號(+)字元,不是字母或數字的字元將被替換為它們的十六進製制數字形式,格式為%hh。hh是該字元的ascii十六進製制值。

標籤將被替換為「%0d%0a」。

資訊是按它們在表單裡出現的順序排列的。資料域的名字和資料域的值通過等號(=)字元連在一起。各對名/值再通過「&」字元連線在一起。經過這些編碼處理之後,表單訊號就整個成為乙個連續的字元流,裡面包含著將被送往伺服器的全部資訊。

因為表單輸入資訊都是經過編碼後傳遞給指令碼程式的,所以cgi擴充套件程式在使用這些引數之前必須對它們進行解碼。

3.2 cgi外部擴充套件程式編制

伺服器程式可以通過三種途徑接收資訊:環境變數、命令列和標準輸入。具體使用哪一種方法要由

它呼叫的伺服器指令碼程式是/cgi/bin/cgi_gpio.cgi。cgi擴充套件程式中form表單的解碼可參考如下程式:

/*function getpostvars*/

char **getpostvars()

pairlist[paircount]=0;

postvars=(char**)malloc((paircount*2+1)*sizeof(char **));

for(i=0;iif(eqpos=strchr(pairlist[i],'='))else

postvars[paircount*2]=0;

for(i=0;pairlist[i];i++)

free(pairlist[i]);

free(pairlist);

free(postinput);

return postvars;

}其中,unescape_url函式再呼叫x2c函式,把(不是位元組或數字的)特殊字元從其%hh表示方式解碼為文字字元。

/*unescape_url function*/

static void unescape_url(char *url)

}url[x]='0';

}(3)直接url加引數傳遞方法

這是一種不使用表單就可以向cgi傳送資訊的方法。它把資訊直接追加在url位址後面,資訊和url之間用號號(?)來分隔。例如,對於乙個cgi_gpio.cgi的指令碼,可以從如下的鏈結啟動:

/*cgi-bin/cgi_gpio.cgi?flag=1 operate p1

...cgi擴充套件程式中可使用如下**接收資訊:char *get_input;//用於接收環境變數..

.get_input=getenv(「query_string」);

if(get_input)

/*判斷flag=x資訊*/

if(!strcmp(get_input,"flag=0")

...//operate p0

else if(!strcmp(get_input,"flag=1")

...//operate p1

else

...//operate p2

對於上述三種方法,可以根據不同的應用場合和應用要求進行選取。結語

嵌入式web server系統方案可以廣泛應用在許多領域,如自動化裝置的遠端監控、嵌入式gsm短訊息 平台以及遠端家庭醫療等。並且,隨著網際網路應用領域的不斷深入,嵌入式internet技術將得到更為廣泛的應用和發展。

嵌入式Linux系統CGI程式設計技術

嵌入式linux系統cgi程式設計技術 它呼叫的伺服器指令碼程式是 cgi bin cgi gpio.cgi。cgi擴充套件程式中form表單的解碼可參考如下程式 function getpostvars char getpostvars pairlist paircount 0 postvars ...

嵌入式CGI開發

cgi開發 cgi處理步驟1 通過internet把使用者的請求送往伺服器 2 伺服器接受請求並交由cgi處理 3 cgi把處理結果送回伺服器 4 伺服器將結構傳回給使用者。從瀏覽器發給伺服器有兩種方法 method屬性 get和post。get方法是把資料打包放在環境變數query string中...

嵌入式CGI開發之旅 5

原創 嵌入式cgi開發之旅 5 發表於 2009 9 1 20 11 19 用cgic開發c語言的cgi程式 用cgic 庫來開發cgi 程式 cgic 是專門為 cgi開發的乙個 ansi c 庫,封裝了一些c語言 cgi程式設計常用的操作,以及一些字串和環境變數的處理,伺服器提交以後,cgic ...