ARM7的嵌入式Web服務(wù)器設計技術(shù)
3.2 對動(dòng)態(tài)內容和動(dòng)態(tài)表單的實(shí)現
先編寫(xiě)一個(gè)包含DATA x>動(dòng)態(tài)標志和表單的HTML文件,再分別編寫(xiě)動(dòng)態(tài)內容處理功能函數和表單分析處理函數。在建立HTTP服務(wù)器套接字之前,需要先安裝好自己句柄,將網(wǎng)頁(yè)中的動(dòng)態(tài)標識與其對應的動(dòng)態(tài)內容處理功能函數,以及表單標識與表單分析處理函數相關(guān)聯(lián)。圖2中的動(dòng)態(tài)內容/句柄API就是用來(lái)提供變量名/表單名與用戶(hù)定義功能之間的聯(lián)系。
動(dòng)態(tài)內容安裝句柄:
addDynamicContent(“temperature”,&getTemper);
表單安裝句柄:
addDynamicHandler(/control,&myHandler);
其中,temperature和/control分別為網(wǎng)頁(yè)中的動(dòng)態(tài)內容標識和表單標識,getTemper和myHandler分別為動(dòng)態(tài)內容處理功能函數和表單分析處理函數。
這樣,每當有GET請求時(shí),動(dòng)態(tài)內容處理功能函數的返回值將替代動(dòng)態(tài)標志的值嵌入到內容流中。每當有POST請求時(shí),表單分析處理函數調用parseVarialbe功能,簡(jiǎn)單地在內容中查找變量名。一旦發(fā)現,這個(gè)值便被復制到用戶(hù)緩沖器中,直到發(fā)現分界符“&”。POST構造一個(gè)包括報體的HTTP請求報文,發(fā)送給Web服務(wù)器。該報文按照鍵值對其進(jìn)行組裝,使用符號“&”分隔。
3.3 嵌入式Web服務(wù)器主程序
嵌入式Web服務(wù)器主程序流程如圖3所示。本設計中使用的Web服務(wù)器套接字是典型的TCP流套接字。通過(guò)socket()創(chuàng )建一個(gè)套接字,使用bind()將該套接字綁定在80端口上,通過(guò)listen()設定監聽(tīng)的連接數,最后調用accept()等待Web客戶(hù)機的連接請求。一個(gè)套接字支持一個(gè)請求,不能支持永久型連接。當服務(wù)器接收到一個(gè)連接時(shí),功能函數handleConnection()對用戶(hù)請求進(jìn)行解析,根據返回的內容關(guān)閉客戶(hù)機套接字,然后等待另一個(gè)套接字請求。本文引用地址:http://dyxdggzs.com/article/151465.htm
對handleConneetion()功能函數(請求報文分析程序)分析如下:
①在HTTP請求報文中進(jìn)行讀操作,從該套接字循環(huán)讀取,直到滿(mǎn)足以下兩個(gè)條件之一:查找到Content_Length報頭,確定報文報體大??;請求若為post方法,簡(jiǎn)單地查找+QUERY文本。
②處理HTTP請求類(lèi)型。對請求報文的第一個(gè)令牌進(jìn)行識別。如果為GET請求,則從中分析請求的文件名,使用lookupFilename()功能函數查找該文件名,若沒(méi)有則發(fā)送適當的狀態(tài)碼給請求者,若有則調用returnFile原語(yǔ)通過(guò)套接字來(lái)發(fā)送請求文件。如果為HTTP POST請求,則再次分析文件名,然后通過(guò)call Dynamic Handle功能函數調用一個(gè)用戶(hù)定義的功能處理請求。若既非GET請求,也非POST請求,則返回狀態(tài)碼“not implemented”。
4 應用程序文件系統的構造
本設計使用一個(gè)特殊的buildfs應用程序將網(wǎng)頁(yè)文件編譯為順序的數據結構,它將網(wǎng)頁(yè)文件所在的目錄路徑作為變量,將這個(gè)變量作為內容樹(shù)的根。遍歷內容樹(shù),將遇到的每個(gè)文件累計到應用程序文件系統結構中,并寫(xiě)入文件filedata.c。文件filedata.c作為工程文件的一部分,一同被編譯、下載到硬件上。buildfs生成的應用程序文件系統結構如表1所列。當定位一個(gè)文件時(shí),只需找到文件報頭,將文件項目的文件名和源文件名進(jìn)行比較。若文件匹配,則可將后來(lái)檢索的元素調出。
評論