boa與cgic庫(kù)寫(xiě)cgi簡(jiǎn)介

‍嵌入式 WEB 服務(wù)器 BOA 和 CGI
一、嵌入式 WEB 服務(wù)器 BOA 簡(jiǎn)介
嵌入式 WEB 服務(wù)器常見(jiàn)的有:
boa
lighttpd
shttpd
thttpd
mathopd
minihttpd
appweb
goahead

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),臨汾企業(yè)網(wǎng)站建設(shè),臨汾品牌網(wǎng)站建設(shè),網(wǎng)站定制,臨汾網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,臨汾網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

隨著 Internet 技術(shù)的興起,在嵌入式設(shè)備的管理與交互中,基于 Web 方式
的應(yīng)用成為目前的主流,這種程序結(jié)構(gòu)也就是大家非常熟悉的 B/S 結(jié)構(gòu),即在
嵌入式設(shè)備上運(yùn)行一個(gè)支持腳本或 CGI 功能的 Web 服務(wù)器,能夠生成動(dòng)態(tài)頁(yè)面,
在用戶端只需要通過(guò) Web 瀏覽器就可以對(duì)嵌入式設(shè)備進(jìn)行管理和監(jiān)控,非常方
便實(shí)用。
本節(jié)主要介紹這種應(yīng)用的開(kāi)發(fā)和移植工作。
用戶首先需要在嵌入式設(shè)備上成功移植支持腳本或 CGI 功能的 Web 服務(wù)器,然
后才能進(jìn)行應(yīng)用程序的開(kāi)發(fā)。
1、 嵌入式 Web 服務(wù)器移植 ,由于嵌入式設(shè)備資源一般都比較有限,并且
也不需要能同時(shí)處理很多用戶的請(qǐng)求,因此不會(huì)使用 Linux 下最常用的如
Apache 等服務(wù)器,而需要使用一些專門為嵌入式設(shè)備設(shè)計(jì)的 Web 服務(wù)器,這些
Web 服務(wù)器在存貯空間和運(yùn)行時(shí)所占有的內(nèi)存空間上都會(huì)非常適合于嵌入式應(yīng)
用場(chǎng)合。典型的嵌入式 Web 服務(wù)器有 Boa (www.boa.org)和 thttpd
(http://www.acme.com/software/thttpd/)等,它們和 Apache 等高性能的
Web 服務(wù)器主要的區(qū)別在于它們一般是 單進(jìn)程服務(wù)器,只有在完成一個(gè)用戶請(qǐng)
求后才能響應(yīng)另一個(gè)用戶的請(qǐng)求,而無(wú)法并發(fā)響應(yīng),但這在嵌入式設(shè)備的應(yīng)用
場(chǎng)合里已經(jīng)足夠了。
Boa 是一個(gè)非常小巧的 Web 服務(wù)器,可執(zhí)行代碼只有約 60KB。它是一個(gè)單
任務(wù) Web 服務(wù)器,只能依次完成用戶的請(qǐng)求,而不會(huì) fork 出新的進(jìn)程來(lái)處理
并發(fā)連接請(qǐng)求。但 Boa 支持 CGI,能夠?yàn)?CGI 程序 fork 出一個(gè)進(jìn)程來(lái)執(zhí)行。
Boa 的設(shè)計(jì)目標(biāo)是速度和安全,在其站點(diǎn)公布的性能測(cè)試中,Boa 的性能 要好
于 Apache 服務(wù)器。
Boa 程序的移植見(jiàn)附錄一。
二、CGI 和 CGIC 簡(jiǎn)介
1、CGI
目前 Web 技術(shù)中生成動(dòng)態(tài) Web 頁(yè)面的方法有 CGI 和服務(wù)器腳本,如 JSP,
ASP 等,但后者需要 Web 服務(wù)器具有這些腳本的運(yùn)行支持模塊。在嵌入式 Web
服務(wù)器中,考慮到資源限制問(wèn)題,一般都只提供 CGI 支持,因此在嵌入式設(shè)備
中 Web 方式應(yīng)用實(shí)際上就是基于 CGI 的程序開(kāi)發(fā)。
CGI(Common Gateway Intergace 通用網(wǎng)關(guān)界面)是一段運(yùn)行在 Web 服務(wù)
器上的程序,提供同客戶端 Html 頁(yè)面的接口。我們舉個(gè)實(shí)際例子:常見(jiàn)的個(gè)人
主頁(yè)上大都有一個(gè)留言本,留言本的工作方式是這樣的:先由用戶輸入一些信
息,如名字之類的東西,接著用戶按一下“留言”(到目前為止工作都在客戶
端),瀏覽器就把這些信息傳送到服務(wù)器的 CGI 程序中,于是 CGI 程序在服務(wù)
器上按照預(yù)定的方法進(jìn)行處理,在本例中就是把用戶提交的信息存入指定的文
件中,最后 CGI 程序給客戶端發(fā)回一個(gè)“留言結(jié)束”字樣的頁(yè)面,用戶可以在
瀏覽器里看到。
在進(jìn)行 CGI 編程之前,我們先了解 HTML 的一些知識(shí)。CGI 可以使用多種編程
語(yǔ)言來(lái)實(shí)現(xiàn),包括 C、 C++、Perl 等,但在嵌入式設(shè)備的開(kāi)發(fā)中,一般都不會(huì)
采用 Perl 等解釋性語(yǔ)言,因?yàn)檫@種語(yǔ)言還需要有解釋執(zhí)行的支撐模塊,會(huì)占用
存貯空間和內(nèi)存,最常用的方法當(dāng)然是用 C 來(lái)編寫(xiě),但 C 并不是很適合開(kāi)發(fā)象
CGI 這種需要大量進(jìn)行字符串操作的程序,編程比較煩瑣,因此,對(duì)于一個(gè)專
業(yè)的開(kāi)發(fā)人員來(lái)說(shuō),首先想到的應(yīng)該是有沒(méi)有可復(fù)用的庫(kù)來(lái)支持快速高效的開(kāi)
發(fā) CGI 程序。幸運(yùn)的是目前就有不少開(kāi)放源碼的支持 CGI 開(kāi)發(fā)的 C 庫(kù)。我們?cè)?br />此只介紹 CGIC,有興趣的朋友可以自己在 Internet 上搜索其他的 C 庫(kù)。
2、CGIC
CGIC 是一個(gè)支持 CGI 開(kāi)發(fā)的開(kāi)放源碼的標(biāo)準(zhǔn) C 庫(kù),可以免費(fèi)使用,只需要
在開(kāi)發(fā)的站點(diǎn)和程序文檔中有個(gè)公開(kāi)聲明即可,表明程序使用了 CGIC 庫(kù),用戶
也可以購(gòu)買商業(yè)授權(quán)而無(wú)需公開(kāi)聲明。
CGIC 能夠提供以下功能:
1 分析數(shù)據(jù),并自動(dòng)校正一些有缺陷的瀏覽器發(fā)來(lái)的數(shù)據(jù);
2 透明接收用 GET 或 POST 方法發(fā)來(lái)的 From 數(shù)據(jù);
3 能接受上傳文件;
4 能夠設(shè)置和接收 cookies;
5 用一致的方式處理 From 元素里的回車;
6 提供字符串,整數(shù),浮點(diǎn)數(shù),單選或多選功能來(lái)接收數(shù)據(jù);
7 提供數(shù)字字段的邊界檢查;
8 能夠?qū)?CGI 環(huán)境變量轉(zhuǎn)化成 C 中的非空字符串;
9 提供 CGI 程序的調(diào)試手段,能夠回放 CGI 程序執(zhí)行時(shí)的 CGI 狀態(tài);
總之,CGIC 是一個(gè)功能比較強(qiáng)大的支持 CGI 開(kāi)發(fā)的標(biāo)準(zhǔn) C 庫(kù),并支持 Linux,
Unix 和 Windows 等多操作系統(tǒng)。
使用 CGIC 的基本思路:
從 cgic.c 的代碼可以看出,它定義了 main 函數(shù),而在 cgictest.c 中
定義了一個(gè) cgiMain 函數(shù)。也就是說(shuō),對(duì)于使用 CGIC 編寫(xiě)的 CGI 程序,都
是從 cgic.c 中的代碼進(jìn)入,在庫(kù)函數(shù)完成了一系列必要的操作(比如解析參
數(shù)、獲取系統(tǒng)環(huán)境變量)之后,它才會(huì)調(diào)用你的代碼(從你定義的 cgiMain 進(jìn)
入)。
CGIC 庫(kù)的 移植與 cgi 編寫(xiě)測(cè)試見(jiàn)附錄二。
附錄一:Boa 程序的移植(未測(cè)試,僅供參考,先用現(xiàn)成的)
第一步完成 Boa 程序的移植。從 www.boa.org 下載 Boa 源碼,
當(dāng)前最新版本為 0.94.13,將其解壓并進(jìn)入源碼目錄的 src
子目錄
# tar xzf boa-0.94.13.tar.gz
# cd boa-0.94.13/src
生成 Makefile 文件
# ./configure
修改 Makefile 文件,找到 CC=gcc,將其改成 CC = arm-linuxgcc,再找到 CPP = gcc –E,
將其改成 CPP = arm-linux-gcc –E,并保存退出。
然后運(yùn)行 make 進(jìn)行編譯,得到的可執(zhí)行程序?yàn)?boa,將調(diào)試信
息剝?nèi)?,得到的最后程序只有約 60KB 大小。
# make
# arm-linux-strip boa
第二步完成 Boa 的配置,使其能夠支持 CGI 程序的執(zhí)行。Boa 需
要在/etc 目錄下建立一個(gè) boa 目錄,里面放入 Boa 的主要
配置文件 boa.conf。在 Boa 源碼目錄下已有一個(gè)示例 boa.conf,可
以在其基礎(chǔ)上進(jìn)行修改,下面解釋一下該文件的含義:
#監(jiān)聽(tīng)的端口號(hào),缺省都是 80,一般無(wú)需修改
Port 80
# bind 調(diào)用的 IP 地址,一般注釋掉,表明綁定到 INADDR_ANY,
通配于服務(wù)器的所有 IP 地址
#Listen 192.68.0.5
#作為哪個(gè)用戶運(yùn)行,即它擁有該用戶的權(quán)限,一般都是 nobody,
需要/etc/passwd 中有
#nobody 用戶
User nobody
#作為哪個(gè)用戶組運(yùn)行,即它擁有該用戶組的權(quán)限,一般都是
nogroup,需要在/etc/group 文
#件中有 nogroup 組
Group nogroup
#當(dāng)服務(wù)器發(fā)生問(wèn)題時(shí)發(fā)送報(bào)警的 email 地址,目前未用,注釋掉
#ServerAdmin root@localhost
#錯(cuò)誤日志文件。如果沒(méi)有以/開(kāi)始,則表示從服務(wù)器的根路徑開(kāi)始。
如果不需要錯(cuò)誤日志,
則用#/dev/null。在下面設(shè)置時(shí),注意一定要建立/var/log/boa 目錄
ErrorLog /var/log/boa/error_log
#訪問(wèn)日志文件。如果沒(méi)有以/開(kāi)始,則表示從服務(wù)器的根路徑開(kāi)始。
如果不需要錯(cuò)誤日志,
則用#/dev/null 或直接注釋掉。在下面設(shè)置時(shí),注意一定要建立
/var/log/boa 目錄
#AccessLog /var/log/boa/access_log
#是否使用本地時(shí)間。如果沒(méi)有注釋掉,則使用本地時(shí)間。注釋掉則
使用 UTC 時(shí)間
#UseLocaltime
#是否記錄 CGI 運(yùn)行信息,如果沒(méi)有注釋掉,則記錄,注釋掉則不
記錄
#VerboseCGILogs
#服務(wù)器名字
ServerName www.hyesco.com
#是否啟動(dòng)虛擬主機(jī)功能,即設(shè)備可以有多個(gè)網(wǎng)絡(luò)接口,每個(gè)接口都
可以擁有一個(gè)虛擬的 Web 服
#務(wù)器。一般注釋掉,即不需要啟動(dòng)
#VirtualHost
#非常重要,HTML 文檔的主目錄。如果沒(méi)有以/開(kāi)始,則表示從服
務(wù)器的根路徑開(kāi)始。
DocumentRoot /var/www
#如果收到一個(gè)用戶請(qǐng)求的話,在用戶主目錄后再增加的目錄名
UserDir public_html
#HTML 目錄索引的文件名,也是沒(méi)有用戶只指明訪問(wèn)目錄時(shí)返回的
文件名
DirectoryIndex index.html
#當(dāng) HTML 目錄沒(méi)有索引文件時(shí),用戶只指明訪問(wèn)目錄時(shí),boa 會(huì)調(diào)
用該程序生成索引文件然后
#返回給用戶,因?yàn)樵撨^(guò)程比較慢最好不執(zhí)行,可以注釋掉或者給每
個(gè) HTML 目錄加上#DirectoryIndex 指明的文件
#DirectoryMaker /usr/lib/boa/boa_indexer
#如果 DirectoryIndex 不存在,并且 DirectoryMaker 被注釋,那么
就用 Boa 自帶的索引
#生成程序來(lái)生成目錄的索引文件并輸出到下面目錄,該目錄必須是
Boa 能讀寫(xiě)
# DirectoryCache /var/spool/boa/dircache
#一個(gè)連接所允許的 HTTP 持續(xù)作用請(qǐng)求數(shù)目,注釋或設(shè)為 0
都將關(guān)閉 HTTP 持續(xù)作用
KeepAliveMax 1000
#HTTP 持續(xù)作用中服務(wù)器在兩次請(qǐng)求之間等待的時(shí)間數(shù),以秒為單
位,超時(shí)將關(guān)閉連接
KeepAliveTimeout 10
#指明 mime.types 文件位置。如果沒(méi)有以/開(kāi)始,則表示從服務(wù)器的
根路徑開(kāi)始??梢宰⑨尩?br />#避免使用 mime.types 文件,此時(shí)需要用 AddType 在本文件里指明
MimeTypes /etc/mime.types
#文件擴(kuò)展名沒(méi)有或未知的話,使用的缺省 MIME 類型
DefaultType text/plain
#提供 CGI 程序的 PATH 環(huán)境變量值
CGIPath /bin:/usr/bin:/usr/local/bin
#將文件擴(kuò)展名和 MIME 類型關(guān)聯(lián)起來(lái),和 mime.types 文件作用一
樣。如果用 mime.types
#文件,則注釋掉,如果不使用 mime.types 文件,則必須使用
#AddType application/x-httpd-cgi cgi
#指明文檔重定向路徑
#Redirect /bar http://elsewhere/feh/bar
#為路徑加上別名
Alias /doc /usr/doc
#非常重要,指明 CGI 腳本的虛擬路徑對(duì)應(yīng)的實(shí)際路徑。一般所有
的 CGI 腳本都要放在實(shí)際路徑
#里,用戶訪問(wèn)執(zhí)行時(shí)輸入站點(diǎn)+虛擬路徑+CGI 腳本名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
用戶可以根據(jù)自己需要,對(duì) boa.conf 進(jìn)行修改,但必須要保證其
他的輔助文件和設(shè)置必須和 boa.conf 里的配置相符,
不然 Boa 就不能正常工作。 在上面的例子中,我們還需要?jiǎng)?chuàng)建日志
文件所在目錄/var/log/boa,
創(chuàng)建 HTML 文檔的主目錄/var/www,將 mime.types 文件拷貝 到
/etc 目錄,
創(chuàng)建 CGI 腳本所在目錄/var/www/cgi-bin/。mime.types 文件用來(lái)指
明不同文件擴(kuò)展名對(duì)應(yīng)的 MIME 類型,
一般 可以直接從 Linux 主機(jī)上拷貝一個(gè),大部分也都是在主機(jī)的
/etc 目錄下。
==================================================
=================
===================host
test=======================================
1.進(jìn)入 boa-0.94.13/src
./configure
make
2.在 etc/下建立 boa 目錄并將 boa.conf 拷貝到該目錄下.更改
boa.conf
Group nogroup ===》Group 0
3.在 /var/log/下建立 boa 目錄,該目錄下可以查看 boa 服務(wù)器的日

4.其它的一些路徑
默認(rèn)是/var/www 下的內(nèi)容可以訪問(wèn) (DocumentRoot
/var/www)
默認(rèn) cgi :ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ (cgi 可執(zhí)行程序放
在 /usr/lib/cgi-bin/目錄下)
例子 http://201.201.201.249/cgi-bin/cgi-test.cgi
CGIPath /bin:/usr/bin:/usr/local/bin
只有這些目錄下的命令可以被調(diào)用,如果要 root 的權(quán)限(如
ifconfig 配置 ip)需要加上/sbin
附錄二:CGIC 庫(kù)移植(測(cè)試通過(guò),目標(biāo)是路由器,mips架構(gòu))
一、CGIC 的移植過(guò)程:
從 CGIC 的主站點(diǎn) http://www.boutell.com/cgic/下載源碼,當(dāng)前最
新版本是 2.05 版。在任一目錄將其解壓并進(jìn)入源碼目錄。
# tar xzf cgic205.tar.gz
# cd cgic205
# chmod 777 cgic205
修改 cgic205 中 Makefile 文件,
1. 找到 CC=gcc,將其改成 CC= mipsel -linux-gcc,
2. 找到 AR=ar,將其改成 AR= mipsel -linux-ar,
3. 找到 RANLIB=ranlib,將其改成 RANLIB= mipsel -linux-ranlib。
4. 找到 gcc cgictest.o -o cgictest.cgi ${LIBS},將其改成$(CC)
$(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS},
5. 找到 gcc capture.o -o capture ${LIBS},將其改成$(CC)
$(CFLAGS) capture.o -o capture ${LIBS},
6. 文件存放路徑:找到
install: libcgic.a
cp libcgic.a /usr/local/lib
cp cgic.h /usr/local/include
改成:
install: libcgic.a
cp libcgic.a /work/RT288x_SDK/RT288x_SDK/source/lib/lib
cp cgic.h
/work/RT288x_SDK/RT288x_SDK/source/user/boa/cgi-bin
注意 cp 等命令前以 tab 鍵開(kāi)頭,不要用空格鍵。
接下來(lái)第 7,8 兩步要獲取反轉(zhuǎn)意函數(shù)功能:
7.打開(kāi) cgic.c,找到這一行語(yǔ)句:
static cgiUnescapeResultType cgiUnescapeChars(char **sp,
char *cp, int len);
將 static 去掉,將聲明添加到 cgic.h,加 extern:
extern cgiUnescapeResultType cgiUnescapeChars(char **sp,
char *cp, int len);
8. 將結(jié)構(gòu)體:
typedef enum {
cgiUnescapeSuccess,
cgiUnescapeMemory
} cgiUnescapeResultType;
把這幾行語(yǔ)句復(fù)制到 cgic.h 文件中,并在這里把它注釋掉:
#if 0
typedef enum {
cgiUnescapeSuccess,
cgiUnescapeMemory
} cgiUnescapeResultType;
#endif
并保存退出。 然后運(yùn)行 make 進(jìn)行編譯。
添加編譯器路徑:
#export PATH=$PATH:/opt/buildroot-gcc342/bin/
#make
#make install
這樣 就生成庫(kù)文件 libcgic.a。
接下來(lái)用 cgic 編寫(xiě)一個(gè) cgi 例子:
二、用 cgic 編寫(xiě)一個(gè) cgi
1. 寫(xiě)一段完整代碼 cgi_string_escape.c,保存到文件夾
/work/RT288x_SDK/RT288x_SDK/source /user/boa/cgi-bin 。
#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>
extern char *cgiQueryString;
extern cgiUnescapeResultType cgiUnescapeChars(char **sp,
char *cp, int len);
int cgiMain() {
char * buffer;
cgiHeaderContentType("text/html");
fprintf(cgiOut, "<HTML><HEAD>n");
fprintf(cgiOut, "<TITLE>MyCGIC</TITLE></HEAD>n");
fprintf(cgiOut, "<BODY>");
cgiUnescapeChars(&buffer, cgiQueryString,
strlen(cgiQueryString));
fprintf(cgiOut, "<H1>I LOVE CGIC!東明電子研發(fā)部</H1>");
fprintf(cgiOut, "<H2>%s</H2>",buffer);
fprintf(cgiOut, "</BODY>n");
fprintf(cgiOut, "</HTML>n");
return 0;
}
2. 修改/work/RT288x_SDK/RT288x_SDK/source /user/boa/cgibin 下 makefile 文件。在相似處添加文件信息。
1)在 LDLIBS += -lnvram 下添加鏈接庫(kù)
LDLIBS += -lcgic
2)在 CGI_STRING = cgi_string.cgi 下添加變量
CGI_STRING_ESCAPE = cgi_string_escape.cgi
3)在 ALL_EXE += $(CGI_STRING)下添加
ALL_EXE += $(CGI_STRING_ESCAPE)
4)在
$(CGI_STRING): cgi_string.o
$(CC) -o $@ cgi_string.o $(LDFLAGS) $(EXTRALIBS)
$(LDLIBS)
下添加規(guī)則:
$(CGI_STRING_ESCAPE): cgi_string_escape.o
$(CC) -o $@ cgi_string_escape.o $(LDFLAGS) $(EXTRALIBS)
$(LDLIBS)
5)在
$(ROMFSINST) $(WEB_DIRECTORY)/cgi-bin/$(CGI_STRING)
下添加:
$(ROMFSINST) $(WEB_DIRECTORY)/cgibin/$(CGI_STRING_ESCAPE)
6)在
cgi_dtring.o: cgi_dtring.c $(CONF_H) $(UCONF_H)
$(BUSYBOXCONF_H) $(CGIC_H)
下添加依賴關(guān)系:
cgi_dtring_escape.o: cgi_dtring_escape.c $(CONF_H)
$(UCONF_H) $(BUSYBOXCONF_H) $(CGIC_H)
保存退出。
3.到路徑下/work/RT288x_SDK/RT288x_SDK/source/編譯工程。將
RT288x_SDKRT288x_SDKsourceimages 中 uImage 燒
寫(xiě)到機(jī)器。
4.局域網(wǎng)中:將 pc 機(jī) ip 地址改成與機(jī)器同一網(wǎng)段.
Ip 地址:192.168.0.132
網(wǎng)關(guān):192.168.0.1
5.在瀏覽器中輸入:
http://192.168.0.178/cgi-bin/cgi_string_escape.cgi?東明電子
company!
注意字符前用?號(hào)連接。將字符“東明電子 company!”傳給服務(wù)
器。
網(wǎng)頁(yè)中接受反饋顯示如下則測(cè)試通過(guò): ‍(本例結(jié)束。)

新聞名稱:boa與cgic庫(kù)寫(xiě)cgi簡(jiǎn)介
當(dāng)前路徑:http://muchs.cn/article8/cjjjip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、虛擬主機(jī)網(wǎng)站收錄、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)