




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第18章 一個簡單的Web服務(wù)器的例子SHTTPD,在第六章的用戶空間網(wǎng)絡(luò)程序簡介中對HTTP協(xié)議進行了簡單的介紹,本章將實現(xiàn)一個簡單的Web服務(wù)器程序SimpleHTTPDemo,簡稱SHTTPD。這個Web服務(wù)器可以實現(xiàn)簡單的用戶配置、靜態(tài)網(wǎng)頁相應(yīng)等功能。按照如下步驟進行設(shè)計和編寫程序。 定義需求,明確需求定義。 對需求進行分析,明確實現(xiàn)的方式和關(guān)鍵的問題,進行模塊設(shè)計 按照模塊設(shè)計,進行編碼 最后進行編譯和測試,18.1 SHTTPD的需求分析,Web服務(wù)器SHTTPD可以實現(xiàn)動態(tài)配置、多客戶訪問、CGI支持、支持HTTP/1.0版本,最終能實現(xiàn)簡單的可用型Web服務(wù)器,多種瀏覽器可以正
2、常訪問SHTTPD上的網(wǎng)頁。,18.1.1 SHTTPD啟動參數(shù)可動態(tài)配置的需求,服務(wù)器dHTTP可以動態(tài)配置啟動參數(shù),例如服務(wù)器的偵聽端口、支持客戶端并發(fā)訪問的數(shù)量、超時時間的設(shè)置、訪問web網(wǎng)頁的路徑等。采用參數(shù)配置和文件配置兩種支持方式,在優(yōu)先級上,參數(shù)配置比文件配置的優(yōu)先級高,參數(shù)配置的選項值會覆蓋文件配置的選項。 1命令行參數(shù)配置 2文件配置,18.1.1 SHTTPD啟動參數(shù)可動態(tài)配置的需求,18.1.2 SHTTPD的多客戶端支持的需求,SHTTPD支持多個客戶端的并發(fā)連接,在同一時刻允許多個客戶端同時成功獲得服務(wù)器上的網(wǎng)頁資源,這是現(xiàn)代服務(wù)器的基本屬性。SHTTPD啟動時的處理
3、單元初始化了兩個,并發(fā)訪問數(shù)量為2,當客戶端增加時,會自動根據(jù)現(xiàn)場情況增加處理單元,最大為4個。,18.1.2 SHTTPD的多客戶端支持的需求,18.1.3 SHTTPD支持方法的需求,HTTP協(xié)議中定義了八種方法,用來來表示對指定數(shù)據(jù)的操作的性質(zhì)和特點: HEAD方法。 GET方法。 POST方法。 PUT上傳指定資源 DELETE 刪除指定資源 TRACE方法。 OPTIONS方法。 CONNECT方法。 HTTP服務(wù)器至少應(yīng)該實現(xiàn)Get和Head方法,可能的話,也實現(xiàn)OPTIONS方法。,18.1.4 SHTTPD支持的HTTP協(xié)議版本的需求,超文本傳輸協(xié)議從開始出現(xiàn)到現(xiàn)在已經(jīng)演化出了
4、很多版本,它們中的大部分都是向下兼容的。在RFC 2145中描述了HTTP版本號的用法??蛻舳嗽谡埱蟮臅r候先告訴服務(wù)器客戶端所采用的HTTP協(xié)議版本號,而后者則在響應(yīng)中采用相同或者更早的協(xié)議版本。目前版本有0.9、1.0和1.1版本。 HTTP/0.9版本 HTTP/1.0版本 HTTP/1.1版本,18.1.5 SHTTPD支持頭部的需求,HTTP協(xié)議的頭部有很多內(nèi)容,本書中僅介紹幾個常用的頭域。 主機頭域: 參考頭域: 時間頭域: 范圍頭域: 用戶代理頭域:,18.1.6 SHTTPD定位URI的需求,URI是Universal Resource Identy的簡寫,是同一資源標識符的意思
5、,它是一種格式化的字符串,通過名稱、地址或者其他別的特征來確定網(wǎng)絡(luò)資源的位置。URI已經(jīng)廣為人知,例如WWW地址、通用文件標識符、統(tǒng)一資源定位器(URL)、統(tǒng)一資源名稱(URN)等。 1URI的一般語法 2HTTP URL 3URI 比較,18.1.7 SHTTPD支持CGI的需求,CGI腳本是任何運行在Web服務(wù)器上的程序,CGI是Common Gateway Interface的縮寫,“通用網(wǎng)關(guān)接口”的意思。簡單的講,CGI腳本是一個可以運行在Web服務(wù)器上的程序,有瀏覽器的輸入觸發(fā)。使用這種腳本,可以執(zhí)行服務(wù)器端的任何操作,但CGI腳本通常用于構(gòu)建服務(wù)器程序和其他系統(tǒng)程序,例如數(shù)據(jù)庫之間
6、的橋梁。 CGI腳本可能是一個腳本,或者一個二進制可執(zhí)行程序,也就是說它可能是一個編譯好的程序或者批命令文件或者其他可執(zhí)行的東西。它的一個共同的特性是可以執(zhí)行并將結(jié)果反饋回來。 CGI腳本可以利用如下的兩種方法使用:作為一個表單的ACTION的響應(yīng)對象的URL。,18.1.8 SHTTPD錯誤代碼的需求,錯誤代碼,即狀態(tài)碼是試圖理解和滿足請求的三位數(shù)字的整數(shù)碼。狀態(tài)碼的第一位數(shù)字定義應(yīng)答類型,后兩位數(shù)字沒有任何類型任務(wù)。第一位數(shù)字有五種值: -1xx: 報告的,接收到請求,繼續(xù)進程。 -2xx 成功,操作成功的收到。 -3xx 重發(fā),為了完成請求,必須采取進一步措施。 -4xx 客戶端出錯,請
7、求包括錯的順序或不能完成。 -5xx 服務(wù)器出錯,服務(wù)器無法完成顯然有效的請求。,18.2 SHTTPD的模塊分析和設(shè)計,要實現(xiàn)SHTTPD服務(wù)器,需要對服務(wù)器的架構(gòu)和模塊進行仔細的分析,例如客戶、服務(wù)器模式的選型,CGI的實現(xiàn)方法、命令行腳本的解析等。本節(jié)對18.1小結(jié)中的需求進行仔細的分析,提供一種解決的方法。,18.2.1 SHTTPD的主函數(shù),為了更好的展示web服務(wù)器的架構(gòu),SHTTPD的主函數(shù)設(shè)計為十分簡單的模型。主函數(shù)僅僅調(diào)用必要的功能函數(shù),具體細節(jié)有各功能函數(shù)實現(xiàn)。主函數(shù)完成四個部分的功能: 初始化服務(wù)器配置參數(shù)、套接字初始化的一些操作、運行調(diào)度函數(shù)、掛接信號處理函數(shù)。,18.
8、2.1 SHTTPD的主函數(shù),18.2.2 SHTTPD命令行解析的分析設(shè)計,服務(wù)器SHTTPD的命令行解析,需要進行大量的命令行字符串解析,程序設(shè)計起來比較麻煩。 1函數(shù)getopt_long介紹 2SHTTPD中的命令行選項定義,18.2.2 SHTTPD命令行解析的分析設(shè)計,18.2.3 SHTTPD配置文件解析的分析設(shè)計,服務(wù)器SHTTPD的配置文件格式與一般的配置文件格式基本一致,即可以以#開頭的注釋行,或者按照關(guān)鍵字=值的格式書寫。格式如下: #注釋|空格關(guān)鍵字空格=空格value,18.2.3 SHTTPD配置文件解析的分析設(shè)計,18.2.4 SHTTPD的多客戶端支持的分析設(shè)計
9、,服務(wù)器SHTTPD的多客戶端支持模塊為此程序的主處理模塊。在此模塊中進行客戶端連接的處理、請求數(shù)據(jù)的接收、響應(yīng)數(shù)據(jù)的發(fā)送和服務(wù)線程的調(diào)度。模塊的核心部分采用線程池的服務(wù)器模型。,18.2.4 SHTTPD的多客戶端支持的分析設(shè)計,18.2.5 SHTTPD頭部解析的分析設(shè)計,HTTP請求的格式如下所示: METHOD URI HTTP/1|0.9|0|1rn 主要包含方法、URI、HTTP的版本,目前SHTTPD服務(wù)器所支持的方法僅為GET,因為GET方法可以滿足大部分的Web應(yīng)用。HTTP的版本,可以取值為0.9、1.0或者1.1。 可以用如下的方法可以獲得HTTP版本的主版本號和次版本號
10、: sscanf(p, HTTP/%lu.%lu, ,18.2.6 SHTTPD對URI的分析設(shè)計,URI是客戶端請求主機網(wǎng)絡(luò)資源的位置,對于URI的分析主要包含如下需要特別進行注意的部分: 資源位置的確定。請求主機的位置以“/”開始,其后為相對路徑,要注意請求的路徑中使用“./././”的形式取得請求范圍的擴大。資源位置的最后一個“/”之后的字符串為實際請求的文件名,需要根據(jù)此文件名判定請求資源的類型,例如請求一個常規(guī)文件、請求一個目錄來獲得目錄下面所有文件的列表、請求CGI等。 URI資源中的“保留”和“危險”字符集。此字符集中的字符字符等同于它們的“% HEX HEX”編碼,即對于一個以
11、“%”開頭的字符,需要進行轉(zhuǎn)換后使用其正真的值。,18.2.7 SHTTPD支持方法的分析設(shè)計,服務(wù)器dHTTP的方法僅支持GET,使用GET方法可以滿足大多數(shù)的靜態(tài)網(wǎng)頁的應(yīng)用。在對客戶端的請求進行解析獲得請求的方法為GET后,服務(wù)器端的方法實現(xiàn)主要分為如下幾個部分: 頭部信息的組織。 文件內(nèi)容的發(fā)送。,18.2.8 SHTTPD支持CGI的分析設(shè)計,Web服務(wù)器中的CGI是一段外部程序,它可以動態(tài)的生成代碼,并可以接收輸入的參數(shù)。支持CGI主要分為如下幾個部分: CGI運行程序和輸入?yún)?shù)的分析; 一個進程運行CGI程序,將CGI程序的輸出發(fā)給與客戶端通信的進行; 與客戶端通信的進行生成頭部信
12、息,并將CGI運行進行的輸出發(fā)給客戶端; CGI程序及參數(shù)的分析用于得到CGI程序和CGI程序運行時的輸入?yún)?shù)。,18.2.8 SHTTPD支持CGI的分析設(shè)計,18.2.9 SHTTPD錯誤處理的分析設(shè)計,當用戶的請求發(fā)生錯誤,或者服務(wù)器端發(fā)生錯誤以及網(wǎng)絡(luò)傳輸過程中發(fā)生錯誤時,需要給客戶端發(fā)送合適的錯誤信息,應(yīng)該包含錯誤代碼和錯誤含義。發(fā)送給出錯客戶端的信息格式為: HTTP/主版本.副版本 錯誤代碼 錯誤信息rn Content-Type:內(nèi)容類型rn Content-Length:內(nèi)容長度rn rn 錯誤信息,18.2.9 SHTTPD錯誤處理的分析設(shè)計,18.3 SHTTPD各模塊的實
13、現(xiàn),Web服務(wù)器SHTTPD中實現(xiàn)的模塊有命令行解析、文件配置解析、多客戶端支持、URI解析、請求方法的解析、請求方法的響應(yīng)、CGI的支持、HTTP版本的支持、內(nèi)容類型的實現(xiàn)、錯誤的處理方法、對目錄列表的顯示以及主函數(shù)的實現(xiàn),本節(jié)對上述的實現(xiàn)方法進行介紹。,18.3.1 SHTTPD命令行解析的實現(xiàn),SHTTPD可以根據(jù)用戶的命令行輸入進行服務(wù)器的配置。在解析用戶輸入的參數(shù)后,對默認參數(shù)進行修改來啟動服務(wù)器。 1配置文件的結(jié)構(gòu) 2命令行解析結(jié)構(gòu) 3命令行解析代碼,18.3.2 SHTTPD文件配置解析的實現(xiàn),服務(wù)器SHTTPD配置文件的優(yōu)先級最高,對其進行解析后的值覆蓋其他配置部分的值。單行配
14、置文件的格式為: 空格#注釋|空格關(guān)鍵字空格=空格value,18.3.3 SHTTPD的多客戶端支持的實現(xiàn),服務(wù)器SHTTPD的多客戶端支持框架的函數(shù)主要為Worker_ScheduleRun()和函數(shù)Worker_ScheduleStop(),這兩個函數(shù)通過對結(jié)構(gòu)struct worker_opts進行管理來控制線程的狀態(tài)。結(jié)構(gòu)struct worker_opts的原型如下: struct worker_opts pthread_t th;/*線程的ID號*/ int flags;/*線程狀態(tài)*/ pthread_mutex_t mutex;/*線程任務(wù)互斥*/ struct worker
15、_ctl *work;/*本線程的總控結(jié)構(gòu)*/ ;,18.3.4 SHTTPD所請求URI解析的實現(xiàn),服務(wù)器SHTTPD中URI解析主要包含“有害”字符的替換,即將以“%”開始的字符進行轉(zhuǎn)換。例如將“%20”轉(zhuǎn)換為“空格”。,18.3.5 SHTTPD方法解析的實現(xiàn),服務(wù)器SHTTPD請求方法的解析比較簡單,使用比較字符串的方法。建立一個表示請求方法的結(jié)構(gòu)數(shù)組,逐個比較客戶端請求方法的字符串和數(shù)組中成員請求方法的異同。請求方法的結(jié)構(gòu)如下,ptr表示請求方法的名稱,len表示請求方法的長度,type表示請求方法的類型: typedef struct vec char int len; SHTTP
16、D_METHOD_TYPE type; vec;,18.3.6 SHTTPD響應(yīng)方法的實現(xiàn),服務(wù)器SHTTPD可以識別的方法為GET、PUT、POST、DELETE和HEAD等,但僅實現(xiàn)了GET方法。在請求方法分析中已經(jīng)可以獲得客戶端請求的方法,在響應(yīng)中,只要匹配其方法就可以了。,18.3.7 SHTTPD支持CGI的實現(xiàn),CGI支持的實現(xiàn)主要包含CGI命令獲取、CGI參數(shù)獲取、管道進程間連接、主進程從CGI進程讀取數(shù)據(jù)和發(fā)送數(shù)據(jù)、CGI進程執(zhí)行并發(fā)送結(jié)果給主進程。,18.3.8 SHTTPD支持HTTP協(xié)議版本的實現(xiàn),服務(wù)器SHTTPD支持的HTTP協(xié)議版本為0.9、1.0和1.1,當協(xié)議的
17、版本不為此范圍時,返回錯誤值505,表示不支持的服務(wù)器版本。代碼如下: len -= pos -p; p = pos; sscanf(p, HTTP/%lu.%lu, ,18.3.9 SHTTPD內(nèi)容類型的實現(xiàn),內(nèi)容類型表示服務(wù)器支持資源的格式,例如文本格式、超文本格式、流媒體的多種格式等等。定義的內(nèi)容類型格式如下: enum MINET_HTML,MINET_HTM,MINET_TXT,MINET_CSS,MINET_ICO,MINET_GIF,MINET_JPG,MINET_JPEG, MINET_PNG,MINET_SVG,MINET_TORRENT,MINET_WAV,MINET_MP
18、3,MINET_MID,MINET_M3U,MINET_RAM, MINET_RA,MINET_DOC,MINET_EXE,MINET_ZIP,MINET_XLS,MINET_TGZ,MINET_TARGZ,MINET_TAR, MINET_GZ,MINET_ARJ,MINET_RAR,MINET_RTF,MINET_PDF,MINET_SWF,MINET_MPG,MINET_MPEG, MINET_ASF,MINET_AVI,MINET_BMP ;,18.3.10 SHTTPD錯誤處理的實現(xiàn),服務(wù)器SHTTPD支持錯誤值絕大多數(shù)的錯誤響應(yīng),其錯誤代碼定義如下: enum ERROR301=3
19、01, ERROR302=302, ERROR303, ERROR304, ERROR305, ERROR307=307, ERROR400=400, ERROR401, ERROR402, ERROR403, ERROR404, ERROR405, ERROR406, ERROR407, ERROR408, ERROR409, ERROR410, ERROR411, ERROR412, ERROR413, ERROR414, ERROR415, ERROR416, ERROR417, ERROR500=500, ERROR501, ERROR502, ERROR503, ERROR504,
20、ERROR505 ;,18.3.11 SHTTPD生成目錄下文件列表文件的實現(xiàn),當客戶端請求的是一個目錄名的時候,需要判斷是否當前目錄下有一個與默認文件名一致的文件。如果沒有,則需要將當前目錄下面的所有目錄列表出來,并形成超級鏈接。,18.3.12 SHTTPD主函數(shù)的實現(xiàn),服務(wù)器SHTTPD的主函數(shù)代碼如下,主要功能為掛接SIGINT信號、初始化參數(shù)配置、服務(wù)器套接字初始操作,然后執(zhí)行工作調(diào)度任務(wù)。 int main(int argc, char *argv) signal(SIGINT, sig_int);/*掛接信號SIGINT*/ Para_Init(argc,argv);/*參數(shù)初始
21、化*/ int s = do_listen();/*套接字初始化*/ Worker_ScheduleRun(s);/*任務(wù)調(diào)度*/ return 0; ,18.4 SHTTPD的編譯、調(diào)試和測試,本節(jié)在之前的代碼的基礎(chǔ)上建立源代碼文件、建立Makefile、對文件進行編譯,然后對SHTTPD服務(wù)器進行測試。,18.4.1 建立源文件,源文件主要有如下幾個,數(shù)據(jù)結(jié)構(gòu)基本都在shttpd.h中放置;配置參數(shù)的解析和獲得在shttpd_parameters.c文件中實現(xiàn);主函數(shù)在shttpd.c中實現(xiàn);客戶端請求的業(yè)務(wù)處理在文件shttpd_worker.c中;關(guān)于URI的分析在文件shttpd_uri.c文件中;而文件shttpd_request.c中則是對客戶端請求的分析;shttpd_mine.c中放置的是請求內(nèi)容的類別相關(guān)變量和函數(shù);shttpd_error.c中的代碼為HTTP協(xié)議的錯誤處理函數(shù)和變量;CGI相關(guān)的函數(shù)放置在shttpd_cgihandle.c中。 shttpd.h shttpd_parameters.c shttpd.c shttpd_worker.c shttpd_uri.c shttpd_request.c shttpd_method.c shttpd_mine.c
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文具企業(yè)競爭力分析與提升策略考核試卷
- 搬家行業(yè)節(jié)能減排與綠色物流考核試卷
- 期貨市場交易風(fēng)險監(jiān)測與預(yù)警考核試卷
- 小學(xué)生抗旱主題班會課件
- 客廳家具批發(fā)考核試卷
- 工業(yè)氣體批發(fā)考核試卷
- 2023視頻監(jiān)控及火災(zāi)報警系統(tǒng)施工作業(yè)指導(dǎo)書
- 上海建房合同范本
- 空調(diào)技術(shù)入股合同范本
- 汽修門頭合作合同范本
- 2025年山東青島自貿(mào)發(fā)展有限公司招聘筆試參考題庫含答案解析
- 液化氣罐的使用和安全防范
- 2025年中考物理總復(fù)習(xí)《內(nèi)能》專項測試卷含有答案
- 會計法律法規(guī)答題答案
- 2024年無錫工藝職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 劇本殺范本完整版
- 北師大版一年級語文下冊第一單元元宵節(jié)《1元宵節(jié)》
- 2024年全球協(xié)作機器人產(chǎn)業(yè)發(fā)展白皮書
- 消防設(shè)施維保過程風(fēng)險及保障措施
- 智能交通系統(tǒng)概論 課件全套 朱文興 第1-10章 緒論 - 城市交通子區(qū)控制系統(tǒng)
- 一鍵自動生成spccpkmsappk數(shù)據(jù)工具
評論
0/150
提交評論