WEB-模塊詳細設(shè)計說明_第1頁
WEB-模塊詳細設(shè)計說明_第2頁
WEB-模塊詳細設(shè)計說明_第3頁
WEB-模塊詳細設(shè)計說明_第4頁
WEB-模塊詳細設(shè)計說明_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

技術(shù)文件技術(shù)文件名稱:WEB軟件模塊詳細設(shè)計說明技術(shù)文件編號:版本:1.0共頁(包括封面)擬制審核會簽標準化批準住網(wǎng)通信技術(shù)有限公司修改記錄文件編號版本號擬制人/修改人擬制/修改日期更改理由主要更改內(nèi)容(寫要點即可)1.0李建永2006-1-17初版注1:每次更改歸檔文件(指歸檔到事業(yè)部或公司檔案室的文件)時,需填寫此表。注2:文件第一次歸檔時,“更改理由”、“主要更改內(nèi)容”欄寫“無”。

目錄TOC\o"1-3"\h\z1 編寫目的 32 術(shù)語、定義和縮略語 32.1 術(shù)語、定義 32.2 縮略語 33 模塊描述 34 模塊設(shè)計 45 數(shù)據(jù)描述 105.1 數(shù)據(jù)結(jié)構(gòu)說明 105.2 全局變量說明 106 函數(shù)定義 126.1 引用函數(shù)定義 126.2 內(nèi)部函數(shù)定義 126.2.1 內(nèi)部函數(shù)1 126.2.2 內(nèi)部函數(shù)2 126.2.3 內(nèi)部函數(shù)n 127 接口設(shè)計 127.1 用戶接口 127.2 硬件接口 127.3 軟件接口 137.3.1 規(guī)范接口 137.3.2 非規(guī)范接口 138 其它說明 139 參考資料 13

編寫目的<要求:說明編寫本文件的目的在于詳細地說明××××模塊中各成分的設(shè)計考慮,以利于程序員編制程序。>術(shù)語、定義和縮略語術(shù)語、定義<要求:逐項列出本文中用到的難以理解或可能引起混淆的術(shù)語及其定義。>CGI CommonGatewayInterfaceCSS CascadingStyleSheetsMIME MultipurposeInternetMailExtensionsFirmware 嵌入式設(shè)備的軟件nph- NoParseHeaderMini-httpd 一種HTTPServerIE MicrosoftInternetExplorer NetscapeNavigator Netscape的WEB瀏覽器縮略語本文件應(yīng)用了以下縮略語:<要求:逐項列出本文中用到的縮略語及其原文和漢語含義。>模塊描述<要求:從模塊在系統(tǒng)中的位置,實現(xiàn)原理及方式、實現(xiàn)的主要功能等方面來描述該模塊的概貌。>我們說的WEB模塊是指運行在系統(tǒng)中的一個WEB部件。它由兩大部分組成,一是指WEB-Server,這是我們選用一個開源的WEBSerevermini-httpd;另一個部分是指WEB應(yīng)用程序部分,它通常由靜態(tài)的WEB頁面(HTML文件)、圖片及相關(guān)文件(如CSS文件)和動態(tài)的交互WEB部分,如CGI、ASP、JAVASCRIPT等。這里靜態(tài)文件部分我們?nèi)恐С?,動態(tài)WEB部分我們采用CGI+JAVASCRIPT的方式實現(xiàn)(這里JAVASCRIPT是指運行在運行客戶端的JAVASCRIPT)。因為HTML我們使用HTML4.0以上版本,CSS使用2.0版及其以上,故客戶端瀏覽器必須是IE4.0及更高版本、NetscapeNavigator4.0及更高的版本。目前CGI已經(jīng)發(fā)布了2.0及以上版本,但是主流WEBServer急乎還是僅支持到CGI1.1版,所以后文提到CGI的相關(guān)的內(nèi)容全部以CGI1.1為準。WEB模塊的工作流程如下:環(huán)境變量環(huán)境變量/

及輸入/輸出流HTTP應(yīng)答HTTP請求文件系統(tǒng)用戶/瀏覽器WEBSERVERCGI腳本處理說明如下:左邊的虛框內(nèi)代表用戶及其瀏覽器,右邊的虛框代表整個WEB模板。用戶通過瀏覽器向WEB模塊發(fā)出HTTP請求。在WEB模塊內(nèi)部由HTTPServer子模塊接收請求。HTTPServer解析HTTP頭部,決定請求的類型為請求靜態(tài)文件還是請求CGI處理如果請求的為表態(tài)文件,如靜態(tài)HTML頁面,CSS文件,圖片文件等,HTTPServer將從文件系統(tǒng)中讀取該文件,并構(gòu)造HTTP應(yīng)答消息,返回客戶端。如果請求的是CGI處理,HTTPSever讀取CGI腳本文件,并發(fā)起新的進程運行之。CGI從環(huán)境變量和標準輸入中獲取輸入?yún)?shù),并解析輸入處理請求,最后構(gòu)造HTTP應(yīng)答返通過標準輸出將HTTP應(yīng)答返回給客戶瀏覽器。CGI處理時可以從文件系統(tǒng)中讀取必要的信息,也可以向文件系統(tǒng)中存入必要的處理結(jié)果,如用戶上傳的文件等。重要注意:CGI腳本可以很多語言進行實現(xiàn),如C、PERL、JAVAScript等,考慮嵌入式系統(tǒng)的特點,及在本系統(tǒng)中沒有PERL、JAVAScript等腳本解釋器,故選擇用C實現(xiàn)。本系統(tǒng)的參考實現(xiàn)為CE/3,在CE/3實現(xiàn)中HTTPServer并未發(fā)起新的進程來運行CGI腳本,而是修改了HTTPServer,讓其直接調(diào)用CGI模塊的處理入口函數(shù)。這樣實現(xiàn)性能比較高,沒有發(fā)起新進程的開銷;不足之處是,一旦CGI處理模塊出現(xiàn)問題,將可能影響HTTPServer的正常工作,甚至崩潰。這要求在CGI設(shè)計時必須十分小心。模塊設(shè)計<要求:主要用文字、圖表等形式詳細描述該模塊的狀態(tài)遷移、信號流程、程序流程、界面安排、進程關(guān)系、異常處理、錯誤處理等方面。詳細說明本模塊中的可測試性設(shè)計,包括提供的測試接口,測試內(nèi)容和范圍等。>WEB模塊由WEBServer子模塊、應(yīng)用程序子模塊組成。應(yīng)用程序子模塊通常又可以劃為CGI處理子模塊、靜態(tài)文件組成。靜態(tài)文件是指服務(wù)于CGI處理子模塊的處理,如CGI輸出頁面要訪問的圖片、CSS文件、HTML內(nèi)容等。故后文在描述應(yīng)用程序子模塊時將針對CGI處理和靜態(tài)文件處理分開描述。WEBServer子模塊:WEBServer的輸入,WEB瀏覽器(WEBBrowser)向WEBServer發(fā)出的請求最常的包括如下兩類:GET 通過URL編碼格式向WEBServer請求指定的頁面或文件,POST 向WEBServer傳送數(shù)據(jù);WEBServer的輸出:請求的靜態(tài)文件作為輸出、CGI進行輸出、HTTP請求錯誤輸出等。Mini-httpd處理的流程如下:用戶可以通過命令行啟動WEBServerWEBServer解析命令行輸入,初始化WEBServer系統(tǒng)設(shè)置系統(tǒng)對文件訪問的權(quán)限初始化偵聽的socket,initialize_listen_socket()Release模式將進程自己置為守護進程daemon()當有新的客戶端連接時,將發(fā)起一個新進程來處理請求fork()子進程通過handle_request()來處理該求,handle_request()處理如下:接收HTTP請求頭,并解析請求頭設(shè)置HTTP請求應(yīng)答處理的超時時間如果請求頭中未指明了請求的文件,將列舉指定的目錄,在CE/3的參考實現(xiàn)中是輸出了一默認主面。否則調(diào)用dofile()來進行文件處理,即首先對客戶端進行驗證如果驗證失敗退出處理驗證OK,則將文件類型分為兩類:CGI類型和靜態(tài)文件類型CGI類型調(diào)用do_cgi()處理CGI否則,從文件系統(tǒng)中讀入文件并返回給客戶端CGI處理過程如下:構(gòu)造環(huán)境變量,構(gòu)造命令行參數(shù)設(shè)置進程的標準輸出、輸出和出錯描述描述符調(diào)用execve()發(fā)起新進程執(zhí)行CGI腳本程序,在CE/3的參考實現(xiàn)中則是直接調(diào)用cgi_handler()進行CGI處理過程因此cgi_handler()是WEBServer子模塊和CGI處理模塊的接口CGI子模塊:CGI是通用網(wǎng)接口(CommonGatewayInterface)的縮寫,用于動態(tài)處理來自客戶端的HTTP請求,并以HTTP的格式對客戶端做出應(yīng)答。HTTP的請求和應(yīng)答包括兩部分:前一部分是HTTP頭,后一部分HTTP體。HTTP頭與HTTP體用兩個連續(xù)的換行符分隔。HTTP頭中指明CGI處理結(jié)果的狀態(tài)(如200OK,304NotModified,400BadRequest,500InternalServerError等),HTTP體數(shù)據(jù)的格式(即MIME頭,如,text/html,img/jpeg等)以及相關(guān)的信息(如Cookie信息,最大超期時限,是否允許代理緩存等)。HTTP體可以是文本型數(shù)據(jù)也可以是流式數(shù)據(jù),它的類型已經(jīng)在HTTP頭中用MIME頭進行指明。如傳送一段HTML文本,它的MIME頭必須為:Content-Type:text/html,在傳送一個二進制的圖片文件或Firmware文件時,它的MIME頭必須為:Content-Type:img/xxx,后面的xxx代表文件的類型。在代為應(yīng)答時,客戶瀏覽器可以xxx代表的類型對文件進行正確的顯示,如xxx為jpeg時,客戶端瀏覽器將以JPEG格式將圖片顯示。通常,來自客戶端的HTTP請求頭會被WEBServer解析,并存入相應(yīng)的環(huán)境變量中,它些環(huán)境變量在CGI1.1中已經(jīng)給出了定義,詳見:/cgi/。CGI腳本程序通過這些環(huán)境變量和標準輸入stdin獲取來自客戶端的輸入,所以通常CGI腳本程序不需要自己解析HTTP頭部。CGI腳本程序在做出應(yīng)答時,必須指明自己輸出HTTP頭部和HTTP體,頭部與體用兩個連續(xù)的換行符進行分隔。如下給出一個簡單的示例:HTTP/1.0200OK\nContent-Type:text/html\n\n<HTML>\n<BODY>\nHelloworld,thisisanhttprespondsample.\n</BODY>\n</HTML>\n需要說明的,HTTP頭部中的Content-Type:text/html是必須由CGI腳本程序輸出的,因為它指示了HTTP體中的內(nèi)容的類型。HTTP/1.0200OKCGI腳本程序可以不輸出,一般地(在Apache上是如此,mini-httpd也是),如果CGI腳本程序的文件名不是以nph-四字符為開頭,WebServer將會解析CGI腳本程序的應(yīng)答的HTTP,并將HTTP應(yīng)答頭補充完整(Content-type除外)。否則WebServer將不解析CGI腳本程序返回的HTTP應(yīng)答頭。對于基本CE/3的參考實現(xiàn)上,將腳本程序和WEBServer編譯在一個應(yīng)用程序中,所以就不存在單獨的腳本程序,故一般地可以不加HTTP/1.0200OK的應(yīng)答。另外,上文亦提到除HTTP/1.0200OK以外的HTTP應(yīng)答頭。因為WebServe會解析CGI腳本應(yīng)答的HTTP頭部,所以在應(yīng)用程序做出應(yīng)答時必須以下面的格式進行應(yīng)答:Status:[HTTP狀態(tài)碼][狀態(tài)描述]Location:[重定向到的URL]例:Status:200OKStatus:304NotModifiedStatus:400BadRequestStatus:500InternalServerErrorLocation:這一點,很像是mini-httpdServer學習Apache的。上面把主要描述的是CGI腳本處理輸入和輸出,下面在就獲取輸入、加入處理、以及構(gòu)造輸出進行描述。上文提到,CGI腳本程序能從Web服務(wù)器獲取的輸入有兩類:一是環(huán)境變量,二是標準輸入。在CGI1.1中定義了很多環(huán)境變量,其中最最重的環(huán)境變量有如下四個:REQUEST_METHOD HTTP請求的方法,GET/POSTQUERY_STRING 查詢字符串,就是URL中”?“后面的字符串CONTENT_TYPE POST方法時,上傳的數(shù)據(jù)類型,CONTENT_LENGTH POST方法傳送數(shù)據(jù)的長度MIME定義了POST方法時CONTENT_TYPE的取值包括如下有兩類:application/x-www-form-urlencoded URL編碼方式multipart/form-data 多部分FORM數(shù)據(jù)類型我們知道,通常在客戶端通過表單(FORM)以外的方法提交數(shù)據(jù)(如點擊超級鏈接,在Javascript中用location指定URL,或直接在瀏覽器URL中輸入地址)的數(shù)據(jù)均為GET方法;在通過表單來提交數(shù)據(jù)時,我們指示是通過GET方法或是通過POST方法進行提交數(shù)據(jù)。簡而言之:一般只有通過在表單中指明提交的方法為POST,提交類型為POST類型;其它任何提交方法都是GET方法。這里之所以區(qū)分GET方法和POST方法,是因為在這兩種方式下CGI腳本取得數(shù)據(jù)的方式是不同的。通過GET方法提交請求,WEBServer會將它們用URL編碼方式存入環(huán)境QUERY_STRING中;采用POST方法時,CGI腳本必須自己將數(shù)據(jù)從標準輸入中讀取出來,數(shù)據(jù)的長度由CONTENT-LENGTH給出,數(shù)據(jù)的類型由CONTENT-TYPE給出。我們知道,GET方法和POST方法下CONTENT-TYPE的值為application/x-www-form-urlencoded時,它們的編碼方式都是URL編碼方式。故它們有共同的解碼方式,可以提出公共接口,如char*decodeUrl(char*from,char*to,intlen)。在PERL/ASP/JSP等流行的開發(fā)環(huán)境中,通常都一個類似getParameter(char*name)的函數(shù)或方法,它的功能就是從通過URL編碼方式提交的參數(shù)中獲取參數(shù)的值。于是乎,我們也可以提取這樣一個公共函數(shù)。整個處理的數(shù)據(jù)流圖如下:在通過表單提交數(shù)據(jù)時,HTML技術(shù)規(guī)范(specificationstechnically)建意采用POST方法(見:http://www.cs.tut.fi/~jkorpela/forms/methods.html)。在上傳文件時必須使用multipart/form-data類型來提交表單,multipart/form-data類型可以同時提前多個二進制數(shù)據(jù)塊。因為不采用URL編碼方式,因此在傳送大數(shù)據(jù)快時效率也非常高。但是CGI腳本程序必須自己解析每塊數(shù)據(jù)的邊界,并提取出數(shù)據(jù)。所以在實現(xiàn)難上有一定的難度。CONTENT-TYPE為multipart/form-data類型時,HTTP體通常由多塊數(shù)據(jù)組成,分塊數(shù)據(jù)間用特定的邊界符分隔。邊界符可以從CONTENT-TYPE指定的類型后面分離出來,如下例所示,就是一個CONTENT-TYPE的例子:CONTENT_TYPE=multipart/form-data;boundary=7d52af1940a56boundary指示明了分隔符HTTP體中使用的分隔符。注意:在每塊數(shù)據(jù)的開頭,總是以“--”+“boundary的值”為開頭。在最后一塊的尾部,總是以“boundary的值”+“--”結(jié)束HTTP體中的每一部分數(shù)據(jù)塊的都由頭和體組成,頭各體用兩個連續(xù)的換行附進行分隔,如下是一個典型的文件上傳例子的HTTP的體:7d52af1940a56Content-Disposition:form-data;name="userfile1";filename="D:\test.txt"\r\nContent-Type:text/plain\r\n\r\nThisiscontentline1\r\nThisiscontentline2\r\n7d52af1940a56Content-Disposition:form-data;name="submit"Content-Type:text/plain\r\n\r\n上傳文件\r\n7d52af1940a56--它由兩部分組成,前一部分為上傳的文件,后一部分為表單上傳時的提交按鈕。手工分析文件上傳,不是件容易的事,在網(wǎng)上可以搜到很多關(guān)于文件上傳例子,可是直接用C實現(xiàn)的不多(多是PHP/PERL/JSP/ASP的開發(fā)環(huán)境提供好了API)。這里有兩種選擇,其一是下載cgilib使用共提供的API接口,其二是手工分析。第二種方法也不失是種好方法,因為在嵌入式上傳Firmware或配置文件時將只上傳一個或每次只傳一個,并不交叉提交其它表單數(shù)據(jù)。有了上面的分析,從中提出文件也不會是件很難的事。有時限制文件的大小是很有必要的,為了限制文件的大小可以在讀入文件時,判斷是否已經(jīng)超出了最大限制,若是則構(gòu)造一個HTTP錯誤應(yīng)答告知用戶。另外一種就是限制整個POST數(shù)據(jù)的大小,即判斷CONTENT-LENTH是否超限,用后者判斷時不能對文件大小準確限制,但實現(xiàn)卻是最簡單的。至此,CGI腳本處理程序已經(jīng)獲取了輸入,在CE/3的參考實現(xiàn)中,WEBServer調(diào)用cgi_handler()進入CGI腳本處理程序。在CGI腳本處理模塊中定義了如下CGI腳本列表:staticCMDCmdTable[]={ {"menu", menu}, {"net", net}, {"user", users}, {"atm", atm}, {"ip", ip}, {"rate", rate}, {"reconnect", reconnect}, {"reboot", reboot}, {"correct", correct}, {"snmp", snmp}, {"file", files}, {"backup", backup}, {"version", versioninfo}, {"date", dates}, {"init", init}, {"equip", equip}, {"log", logall}, {"lang", langs}, {NULL, NULL}};QUERY_STRING中的第一個參數(shù)名作為查詢頁面,到如上表中進行搜索。搜索到配置的頁面時,運行相應(yīng)的CGI函數(shù)。在CE/3的參考實現(xiàn)中,它沒有像上面所述方法把所有參數(shù)統(tǒng)一取出放在一個參數(shù)列表中,而是每個模塊各自取取出。有了輸入?yún)?shù),模塊就可以獨自處理自己的事情了。需要輸出時,模塊先輸出HTTP頭部再輸出相應(yīng)的HTML文檔。逐個逐個地,一行一行進行printf輸出。像上面描述的那種輸出方法,通常稱之為“非嵌入CGI”,即CGI語句并不嵌入在HTML代碼中間?;谶@種實現(xiàn)的CGI腳本,有通常包括常規(guī)的C語言腳本,PERL語言腳本等(當然現(xiàn)在PERL也支持。它們最大的缺點就是,代碼不夠直觀。另一種是將處理過程直接嵌入在HTML代碼中間,像JSP/ASP/PHP等,代碼比較直觀。另外頁面的輸出帶有一定的緩沖功能,即使后文出現(xiàn)了錯誤,也能將后出現(xiàn)的錯誤最先發(fā)送到用戶瀏覽器,更于代碼流程的控制。相反,在用C的printf直接輸出時并不被緩沖。所以在后文可能會出現(xiàn)錯誤時必須將程序流程進行控制,以便錯誤頁面能夠正確輸出。在多語言的實現(xiàn)上,CE/3的參考實現(xiàn)是依然采用printf的方式,根據(jù)當然輸入語言選項進行輸出。類似于:if(japanese==language) printf(“日文語句”);elseif(english==language) printf(“英文語句”);數(shù)據(jù)描述數(shù)據(jù)結(jié)構(gòu)說明<要求:說明本模塊內(nèi)部用到的主要數(shù)據(jù)結(jié)構(gòu)。定義模塊所使用的各種數(shù)據(jù),規(guī)定靜態(tài)數(shù)據(jù)、動態(tài)輸入輸出數(shù)據(jù)及內(nèi)部生成數(shù)據(jù)的邏輯結(jié)構(gòu),列出這些數(shù)據(jù)的清單,并說明對數(shù)據(jù)的約束。對重要的數(shù)據(jù),要在使用前進行檢驗的方式。任何數(shù)據(jù)都必須規(guī)定其合理的范圍。說明在任何時候都要對重要的數(shù)據(jù)進行合理性檢查,以及采取的故障隔離處理措施。>用于定義CGI頁面名與相應(yīng)的處理腳本函數(shù)結(jié)構(gòu).typedef structcmd{ char *cmd; int(*func)(char*);}CMD;全局變量說明如下是環(huán)境變量是WEBServer傳遞給CGI腳本處理程序的環(huán)境變量:SERVER_PROTOCOL:信息協(xié)議的名字和修訂版。格式為protocol/revision。SERVER_PORT:發(fā)送請求的端口號。REQUEST_METHOD:請求的方法。對于HTTP,有"GET"、"HEAD"、"POST"等等。PATH_INFO:額外的路徑信息,由客戶端給出的。換句話說,腳本可以由他們的虛擬路徑名來訪問,在這個路徑的末尾附帶額外的信息。這個額外信息被作為PAHT_INFO發(fā)送。這個信息如果在傳遞給CGI腳本之前來自URL就可以由服務(wù)器來解碼。PATH_TRANSLATED:服務(wù)器提供了一個PAHT_INFO的轉(zhuǎn)換版本,它需要路徑并且為它做虛擬到物理的映射。SCRIPT_NAME:將要執(zhí)行的腳本的一個虛擬路徑。QUERY_STRING:在引用腳本的URL中緊跟在?之后的信息。這是一個查詢信息。它不能以任何方式來解碼。這個變量總是可以在有查詢信息的時候被設(shè)置,而不管命令行解碼。REMOTE_HOST:產(chǎn)生請求的主機名。如果服務(wù)器沒有這個信息,它應(yīng)該設(shè)置REMOTE_ADDR并且讓這個為未設(shè)置狀態(tài)。REMOTE_ADDR:產(chǎn)生請求的遠程主機的IP地址。AUTH_TYPE:如果服務(wù)器支持用戶驗證,腳本就受保護。這是一個協(xié)議規(guī)范授權(quán)方法,用于驗證用戶。REMOTE_USER:如果服務(wù)器支持用戶驗證,腳本就受保護。這是他們授權(quán)的用戶名。REMOTE_IDENT:如果HTTP服務(wù)器支持RFC931認證,這個變量將被設(shè)置為從服務(wù)器取出的遠程用戶名。這個變量的用法應(yīng)該只限制在登陸的時候。CONTENT_TYPE:對于哪些已經(jīng)附上信息的請求,比如HTTPPOST和PUT,這是數(shù)據(jù)的內(nèi)容類型。CONTENT_LENGTH:客戶端給的數(shù)據(jù)內(nèi)容的長度。定義主CGI頁面與其處理函數(shù)之間關(guān)系的表:staticCMDCmdTable[]={ {"menu", menu}, {"net", net}, {"user", users}, {

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論