boa與cgic庫寫cgi簡介

嵌入式 WEB 服務器 BOA 和 CGI
1、嵌入式 WEB 服務器 BOA 簡介
嵌入式 WEB 服務器常見的有:
boa
lighttpd
shttpd
thttpd
mathopd
minihttpd
appweb
goahead 
隨着 Internet 技術的興起,在嵌入式設備的管理與交互中,基於 Web 方式
的應用成爲目前的主流,這種程序結構也就是你們很是熟悉的 B/S 結構,即在
嵌入式設備上運行一個支持腳本或 CGI 功能的 Web 服務器,可以生成動態頁面,
在用戶端只須要經過 Web 瀏覽器就能夠對嵌入式設備進行管理和監控,很是方
便實用。
本節主要介紹這種應用的開發和移植工做。
用戶首先須要在嵌入式設備上成功移植支持腳本或 CGI 功能的 Web 服務器,然
後才能進行應用程序的開發。
一、 嵌入式 Web 服務器移植 ,因爲嵌入式設備資源通常都比較有限,而且
也不須要能同時處理不少用戶的請求,所以不會使用 Linux 下最經常使用的如
Apache 等服務器,而須要使用一些專門爲嵌入式設備設計的 Web 服務器,這些
Web 服務器在存貯空間和運行時所佔有的內存空間上都會很是適合於嵌入式應
用場合。典型的嵌入式 Web 服務器有 Boa (www.boa.org)和 thttpd
http://www.acme.com/software/thttpd/)等,它們和 Apache 等高性能的
Web 服務器主要的區別在於它們通常是 單進程服務器,只有在完成一個用戶請
求後才能響應另外一個用戶的請求,而沒法併發響應,但這在嵌入式設備的應用
場合裏已經足夠了。
Boa 是一個很是小巧的 Web 服務器,可執行代碼只有約 60KB。它是一個單
任務 Web 服務器,只能依次完成用戶的請求,而不會 fork 出新的進程來處理
併發鏈接請求。但 Boa 支持 CGI,可以爲 CGI 程序 fork 出一個進程來執行。
Boa 的設計目標是速度和安全,在其站點公佈的性能測試中,Boa 的性能 要好
於 Apache 服務器。
Boa 程序的移植見附錄一。
2、CGI 和 CGIC 簡介
一、CGI
目前 Web 技術中生成動態 Web 頁面的方法有 CGI 和服務器腳本,如 JSP,
ASP 等,但後者須要 Web 服務器具備這些腳本的運行支持模塊。在嵌入式 Web
服務器中,考慮到資源限制問題,通常都只提供 CGI 支持,所以在嵌入式設備
中 Web 方式應用實際上就是基於 CGI 的程序開發。
CGI(Common Gateway Intergace 通用網關界面)是一段運行在 Web 服務
器上的程序,提供同客戶端 Html 頁面的接口。咱們舉個實際例子:常見的我的
主頁上大都有一個留言本,留言本的工做方式是這樣的:先由用戶輸入一些信
息,如名字之類的東西,接着用戶按一下「留言」(到目前爲止工做都在客戶
端),瀏覽器就把這些信息傳送到服務器的 CGI 程序中,因而 CGI 程序在服務
器上按照預約的方法進行處理,在本例中就是把用戶提交的信息存入指定的文
件中,最後 CGI 程序給客戶端發回一個「留言結束」字樣的頁面,用戶能夠在
瀏覽器裏看到。
在進行 CGI 編程以前,咱們先了解 HTML 的一些知識。CGI 可使用多種編程
語言來實現,包括 C、 C++、Perl 等,但在嵌入式設備的開發中,通常都不會
採用 Perl 等解釋性語言,由於這種語言還須要有解釋執行的支撐模塊,會佔用
存貯空間和內存,最經常使用的方法固然是用 C 來編寫,但 C 並非很適合開發象
CGI 這種須要大量進行字符串操做的程序,編程比較煩瑣,所以,對於一個專
業的開發人員來講,首先想到的應該是有沒有可複用的庫來支持快速高效的開
發 CGI 程序。幸運的是目前就有很多開放源碼的支持 CGI 開發的 C 庫。咱們在
此只介紹 CGIC,有興趣的朋友能夠本身在 Internet 上搜索其餘的 C 庫。
二、CGIC
CGIC 是一個支持 CGI 開發的開放源碼的標準 C 庫,能夠無償使用,只須要
在開發的站點和程序文檔中有個公開聲明便可,代表程序使用了 CGIC 庫,用戶
也能夠購買商業受權而無需公開聲明。
CGIC 可以提供如下功能:
1  分析數據,並自動校訂一些有缺陷的瀏覽器發來的數據;
2  透明接收用 GET 或 POST 方法發來的 From 數據;
3   能接受上傳文件;
4   可以設置和接收 cookies;
5   用一致的方式處理 From 元素裏的回車;
6   提供字符串,整數,浮點數,單選或多選功能來接收數據;
7   提供數字字段的邊界檢查;
8   可以將 CGI 環境變量轉化成 C 中的非空字符串;
9   提供 CGI 程序的調試手段,可以回放 CGI 程序執行時的 CGI 狀態;
總之,CGIC 是一個功能比較強大的支持 CGI 開發的標準 C 庫,並支持 Linux,
Unix 和 Windows 等多操做系統。
使用 CGIC 的基本思路:
從 cgic.c 的代碼能夠看出,它定義了 main 函數,而在 cgictest.c 中
定義了一個 cgiMain 函數。也就是說,對於使用 CGIC 編寫的 CGI 程序,都
是從 cgic.c 中的代碼進入,在庫函數完成了一系列必要的操做(好比解析參
數、獲取系統環境變量)以後,它纔會調用你的代碼(從你定義的 cgiMain 進
入)。
CGIC 庫的 移植與 cgi 編寫測試見附錄二。
附錄一:Boa 程序的移植(未測試,僅供參考,先用現成的)
第一步完成 Boa 程序的移植。從 www.boa.org 下載 Boa 源碼,
當前最新版本爲 0.94.13,將其解壓並進入源碼目錄的 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,並保存退出。
而後運行 make 進行編譯,獲得的可執行程序爲 boa,將調試信
息剝去,獲得的最後程序只有約 60KB 大小。
# make
# arm-linux-strip boa
第二步完成 Boa 的配置,使其可以支持 CGI 程序的執行。Boa 需
要在/etc 目錄下創建一個 boa 目錄,裏面放入 Boa 的主要
配置文件 boa.conf。在 Boa 源碼目錄下已有一個示例 boa.conf,可
以在其基礎上進行修改,下面解釋一下該文件的含義:
#監聽的端口號,缺省都是 80,通常無需修改
Port 80
# bind 調用的 IP 地址,通常註釋掉,代表綁定到 INADDR_ANY,
通配於服務器的全部 IP 地址
#Listen 192.68.0.5
#做爲哪一個用戶運行,即它擁有該用戶的權限,通常都是 nobody,
須要/etc/passwd 中有
#nobody 用戶
User nobody
#做爲哪一個用戶組運行,即它擁有該用戶組的權限,通常都是
nogroup,須要在/etc/group 文
#件中有 nogroup 組
Group nogroup
#當服務器發生問題時發送報警的 email 地址,目前未用,註釋掉
#ServerAdmin root@localhost
#錯誤日誌文件。若是沒有以/開始,則表示從服務器的根路徑開始。
若是不須要錯誤日誌,
則用#/dev/null。在下面設置時,注意必定要創建/var/log/boa 目錄
ErrorLog /var/log/boa/error_log
#訪問日誌文件。若是沒有以/開始,則表示從服務器的根路徑開始。
若是不須要錯誤日誌,
則用#/dev/null 或直接註釋掉。在下面設置時,注意必定要創建
/var/log/boa 目錄
#AccessLog /var/log/boa/access_log
#是否使用本地時間。若是沒有註釋掉,則使用本地時間。註釋掉則
使用 UTC 時間
#UseLocaltime
#是否記錄 CGI 運行信息,若是沒有註釋掉,則記錄,註釋掉則不
記錄
#VerboseCGILogs
#服務器名字
ServerName www.hyesco.com
#是否啓動虛擬主機功能,即設備能夠有多個網絡接口,每一個接口都
能夠擁有一個虛擬的 Web 服
#務器。通常註釋掉,即不須要啓動
#VirtualHost
#很是重要,HTML 文檔的主目錄。若是沒有以/開始,則表示從服
務器的根路徑開始。
DocumentRoot /var/www
#若是收到一個用戶請求的話,在用戶主目錄後再增長的目錄名
UserDir public_html
#HTML 目錄索引的文件名,也是沒有用戶只指明訪問目錄時返回的
文件名
DirectoryIndex index.html
#當 HTML 目錄沒有索引文件時,用戶只指明訪問目錄時,boa 會調
用該程序生成索引文件而後
#返回給用戶,由於該過程比較慢最好不執行,能夠註釋掉或者給每
個 HTML 目錄加上#DirectoryIndex 指明的文件
#DirectoryMaker /usr/lib/boa/boa_indexer
#若是 DirectoryIndex 不存在,而且 DirectoryMaker 被註釋,那麼
就用 Boa 自帶的索引
#生成程序來生成目錄的索引文件並輸出到下面目錄,該目錄必須是
Boa 能讀寫
# DirectoryCache /var/spool/boa/dircache
#一個鏈接所容許的 HTTP 持續做用請求最大數目,註釋或設爲 0
都將關閉 HTTP 持續做用
KeepAliveMax 1000
#HTTP 持續做用中服務器在兩次請求之間等待的時間數,以秒爲單
位,超時將關閉鏈接
KeepAliveTimeout 10
#指明 mime.types 文件位置。若是沒有以/開始,則表示從服務器的
根路徑開始。能夠註釋掉
#避免使用 mime.types 文件,此時須要用 AddType 在本文件裏指明
MimeTypes /etc/mime.types
#文件擴展名沒有或未知的話,使用的缺省 MIME 類型
DefaultType text/plain
#提供 CGI 程序的 PATH 環境變量值
CGIPath /bin:/usr/bin:/usr/local/bin
#將文件擴展名和 MIME 類型關聯起來,和 mime.types 文件做用一
樣。若是用 mime.types
#文件,則註釋掉,若是不使用 mime.types 文件,則必須使用
#AddType application/x-httpd-cgi cgi
#指明文檔重定向路徑
#Redirect /bar http://elsewhere/feh/bar
#爲路徑加上別名
Alias /doc /usr/doc
#很是重要,指明 CGI 腳本的虛擬路徑對應的實際路徑。通常全部
的 CGI 腳本都要放在實際路徑
#裏,用戶訪問執行時輸入站點+虛擬路徑+CGI 腳本名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
用戶能夠根據本身須要,對 boa.conf 進行修改,但必需要保證其
他的輔助文件和設置必須和 boa.conf 裏的配置相符,
否則 Boa 就不能正常工做。 在上面的例子中,咱們還須要建立日誌
文件所在目錄/var/log/boa,
建立 HTML 文檔的主目錄/var/www,將 mime.types 文件拷貝 到
/etc 目錄,
建立 CGI 腳本所在目錄/var/www/cgi-bin/。mime.types 文件用來指
明不一樣文件擴展名對應的 MIME 類型,
通常 能夠直接從 Linux 主機上拷貝一個,大部分也都是在主機的
/etc 目錄下。
==================================================
=================
===================host
test=======================================
1.進入 boa-0.94.13/src
./configure
make
2.在 etc/下創建 boa 目錄並將 boa.conf 拷貝到該目錄下.更改
boa.conf
Group nogroup  ===》Group 0
3.在 /var/log/下創建 boa 目錄,該目錄下能夠查看 boa 服務器的日

4.其它的一些路徑
默認是/var/www 下的內容能夠訪問                       (DocumentRoot
/var/www)
默認 cgi :ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/  (cgi 可執行程序放
在 /usr/lib/cgi-bin/目錄下)
例子 http://201.201.201.249/cgi-bin/cgi-test.cgi
CGIPath /bin:/usr/bin:/usr/local/bin
只有這些目錄下的命令能夠被調用,若是要 root 的權限(如
ifconfig 配置 ip)須要加上/sbin
附錄二:CGIC 庫移植(測試經過,目標是路由器,mips架構)
1、CGIC 的移植過程:
從 CGIC 的主站點 http://www.boutell.com/cgic/下載源碼,當前最
新版本是 2.05 版。在任一目錄將其解壓並進入源碼目錄。
# 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 鍵開頭,不要用空格鍵。
接下來第 7,8 兩步要獲取反轉意函數功能:
7.打開 cgic.c,找到這一行語句:
static cgiUnescapeResultType cgiUnescapeChars(char **sp,
char *cp, int  len);
將 static 去掉,將聲明添加到 cgic.h,加 extern:
extern cgiUnescapeResultType cgiUnescapeChars(char **sp,
char *cp, int  len);
8. 將結構體:
typedef enum {
cgiUnescapeSuccess,
cgiUnescapeMemory
} cgiUnescapeResultType;
把這幾行語句複製到 cgic.h 文件中,並在這裏把它註釋掉:
#if 0
typedef enum {
cgiUnescapeSuccess,
cgiUnescapeMemory
} cgiUnescapeResultType;
#endif
並保存退出。 而後運行 make 進行編譯。
添加編譯器路徑:
#export PATH=$PATH:/opt/buildroot-gcc342/bin/
#make
#make install
這樣 就生成庫文件 libcgic.a。
接下來用 cgic 編寫一個 cgi 例子:
2、用 cgic 編寫一個 cgi
1.  寫一段完整代碼 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!東明電子研發部</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 下添加連接庫
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)
下添加規則:
$(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)
下添加依賴關係:
cgi_dtring_escape.o: cgi_dtring_escape.c $(CONF_H)
$(UCONF_H) $(BUSYBOXCONF_H) $(CGIC_H)
保存退出。
3.到路徑下/work/RT288x_SDK/RT288x_SDK/source/編譯工程。將
\RT288x_SDK\RT288x_SDK\source\images 中 uImage 燒
寫到機器。
4.局域網中:將 pc 機 ip 地址改爲與機器同一網段.
Ip 地址:192.168.0.132
網關:192.168.0.1
5.在瀏覽器中輸入:
http://192.168.0.178/cgi-bin/cgi_string_escape.cgi?東明電子
company!
注意字符前用?號鏈接。將字符「東明電子 company!」傳給服務
器。
網頁中接受反饋顯示以下則測試經過: ‍(本例結束。)html

I LOVE CGIC!東明電子研發部linux

東明電子company!
web

相關文章
相關標籤/搜索