嵌入式Web伺服器Boa的移植及其應用

2021-05-21 14:56:54 字數 3384 閱讀 1246

隨著嵌入式技術的發展和高速寬頻網路的普及, 利用網路實現遠端監控已為人們廣泛接受, 嵌入式網路監控技術正是在此條件下逐步發展成熟起來的.

1 嵌入式web 伺服器boa 的特點

boa 是一款單任務的http 伺服器, 與其他傳統的web 伺服器不同的是當有連線請求到來時, 它並不為每個連線單獨建立程序, 也不通過複製自身程序來處理多鏈結, 而是通過建立http 請求列表來處理多路http 連線請求, 同時它只為cgi 程式建立新的程序, 這樣就在最大程度上節省了系統資源, 這對嵌入式系統來說至關重要. 同時它還具有自動生成目錄、自動解壓檔案等功能, 因此, boa 具有很高的http 請求處理速度和效率, 在嵌入式系統中具有很高的應用價值.

2 boa 的功能實現

嵌入式web 伺服器boa 和普通web 伺服器一樣, 能夠完成接收客戶端請求、分析請求、響應請求、向客戶端返回請求結果等任務. 它的工作過程主要包括:

( a) 完成web 伺服器的初始化工作, 如建立環境變數、建立tcp 套接字、繫結埠、開始偵聽、進入迴圈結構, 以及等待接收客戶瀏覽器的連線請求; 

( b) 當有客戶端連線請求時,web 伺服器負責接收客戶端請求, 並儲存相關請求資訊; 

( c) 在接收到客戶端的連線請求之後,分析客戶端請求, 解析出請求的方法、url 目標、可選的查詢資訊及表單資訊, 同時根據請求做出相應的處理; 

( d)web 伺服器完成相應處理後, 向客戶端瀏覽器傳送響應資訊, 關閉與客戶機的tcp 連線.

嵌入式web 伺服器boa 根據請求方法的不同, 做出不同的響應. 如果請求方法為head, 則直接向瀏覽器返回響應首部; 如果請求方法為get, 則在返回響應首部的同時, 將客戶端請求的url 目標檔案從伺服器上讀出, 並且傳送給客戶端瀏覽器; 如果請求方法為post, 則將客戶傳送過來的表單資訊傳送給相應的cgi 程式, 作為cgi 的引數來執行cgi 程式, 並將執行結果傳送給客戶端瀏覽器. boa 的功能實現也是通過建立連線、繫結埠、進行偵聽、請求處理等來實現的.

其初始化部分的源**如下:

int server_s;

server_s = socket( server_pf,sock_stream,ipproto_tcp) ;

if( server_s == - 1)

if( set_nonblock_fd( server_s) == - 1)

if( fcntl( server_s,f_setfd,1) == - 1)

if( ( setsockopt( server_s, sol_socket,so_reuseaddr,( void*)&sock_opt,

sizeof( sock_opt) ) ) == - 1)

if( bind_server( server_s, server_ip, server_port) == - 1)

if( listen( server_s, backlog) == - 1)

上述**主要用於開啟乙個有效的socket 描述符, 然後將其轉換為無阻塞套接字. 函式bind( ) 用於建立套接字描述符與指定埠間的關聯, 並通過函式listen( ) 在該指定埠偵聽, 等待遠端連線請求.當偵聽到連線請求時, boa 呼叫函式get_request( int server_sock) 獲取請求資訊, 通過呼叫函式accept( ) 為該請求建立乙個連線. 在建立連線之後, 接收請求資訊, 同時對請求進行分析. 當有cgi 請求時, 為cgi 程式建立程序, 並將結果通過管道傳送輸出. boa 的整體工作流程如圖1 所示.

3 boa 在arm 上的移植

3.1 修改web 伺服器boa

( a) 定義常數buffer_size 為8192, 通過增大buffer_size 的值來增加輸入輸出快取,以提高影象傳輸速度, 從而加快系統的響應速度; 

( b) 修改請求列表引數, 根據可能出現的請求數量修改伺服器可以處理的http 連線數量; 

( c) 為適應嵌入式系統資源較少的情況, 精簡uclinux 作業系統中的庫函式,使用uclibc 進行編譯, 因此要使boa 在嵌入式系統上正常執行, 使用者必須自己實現一些函式功能, 如字串查詢函式strstr( ) 和字串複製函式strdup( ) 等.

3.2 交叉編譯boa

為了建立嵌入式交叉編譯環境, 首先必須安裝arm 交叉編譯工具arm-elf-gcc, 然後使用交叉編譯工具arm-elf-gcc 編譯boa 源程式, 通過執行:

. / configure -target = arm-elf -host = i686-pc-linux-gnu  -build = arm-elf

make

便可生成elf 格式的可執行檔案boa.

通過arm-elf-strip -g boa 指令去除附帶的編譯資訊, 以減少所占用的空間. uclinux 系統採用的romfs 檔案系統相對於一般的ext2 檔案系統需要的空間較少, 因此需要採用elf2flt 工具將生成的boa 的可執行檔案由elf 格式轉換成flat 格式, 並將其新增到romdisk 中.

3.3 配置web 伺服器boa

3.4 測試boa 的執行

為了確保boa 的正常執行, 利用簡單的測試程式測試boa 的運**況. 在目錄/home/httpd/ 下建立index.html 文件, 其內容為:

this is boa

< / body>

< / html>

通過ie 瀏覽器連線到執行boa 的嵌入式系統http://192.168.0.26/ , 若頁面顯示this is boa, 說明boa可以正常獲取頁面.

在/cgi-bin/ 路徑下建立test 檔案, 其內容為:

#!/bin/sh

echo content- type: text/html

echo

echo ""

echo "this is cgi test"

echo "< / body>< / html>"

在ie 瀏覽器輸入位址http: //192.168.0.26/cgi-bin/ test, 若頁面顯示this is cgi test, 說明伺服器可以正常執行cgi 程式.

4 boa 在網路監控系統中的應用

5 結束語

web 伺服器是各種網路應用系統的有機組成部分, 直接影響網路應用系統的執行質量與效率. boa 本身是為嵌入式系統所設計, 它特有的連線處理方式以及直接呼叫作業系統的檔案讀取方式, 大大提高了系統的效能. 它與linux 系統上的web 伺服器aparch 相比占用系統資源少, 連線處理速度快. 在網路監控系統中使用這種嵌入式web 伺服器, 可以節省系統資源, 提高系統執行效率, 充分發揮了網路的優勢.

基於arm的嵌入式boa伺服器移植

cd src 內容如下 修改makefile檔案,修改部分配置如下 cc arm linux gcc cpp arm linux gcc e 將compat.h檔案的 define timezone offset foo foo tm gmtoff修改為 define timezone offset...

嵌入式Web伺服器移植

或者 最新發行版本 0.94.13 解壓 tar xzf boa 0.94.13.tar.gz 直接執行src configure檔案 a 修改 cc gcc 為 cc usr local arm 2.95.3 bin arm linux gcc b 修改 cpp gcc e 為 cpp usr l...

嵌入式Web伺服器移植

文章一僅供個人學習之用,請勿用於他途。n printf n printf n printf n printf n exit 0 交叉編譯生成helloworld.cgi arm softfloat linux gnu gcc o helloworld.cgi helloworld.c 將hellow...