一個(gè)簡(jiǎn)單的web服務(wù)器的例子shttpd.ppt_第1頁
一個(gè)簡(jiǎn)單的web服務(wù)器的例子shttpd.ppt_第2頁
一個(gè)簡(jiǎn)單的web服務(wù)器的例子shttpd.ppt_第3頁
一個(gè)簡(jiǎn)單的web服務(wù)器的例子shttpd.ppt_第4頁
一個(gè)簡(jiǎn)單的web服務(wù)器的例子shttpd.ppt_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第18章 一個(gè)簡(jiǎn)單的Web服務(wù)器的例子SHTTPD,在第六章的用戶空間網(wǎng)絡(luò)程序簡(jiǎn)介中對(duì)HTTP協(xié)議進(jìn)行了簡(jiǎn)單的介紹,本章將實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web服務(wù)器程序SimpleHTTPDemo,簡(jiǎn)稱SHTTPD。這個(gè)Web服務(wù)器可以實(shí)現(xiàn)簡(jiǎn)單的用戶配置、靜態(tài)網(wǎng)頁相應(yīng)等功能。按照如下步驟進(jìn)行設(shè)計(jì)和編寫程序。 定義需求,明確需求定義。 對(duì)需求進(jìn)行分析,明確實(shí)現(xiàn)的方式和關(guān)鍵的問題,進(jìn)行模塊設(shè)計(jì) 按照模塊設(shè)計(jì),進(jìn)行編碼 最后進(jìn)行編譯和測(cè)試,18.1 SHTTPD的需求分析,Web服務(wù)器SHTTPD可以實(shí)現(xiàn)動(dòng)態(tài)配置、多客戶訪問、CGI支持、支持HTTP/1.0版本,最終能實(shí)現(xiàn)簡(jiǎn)單的可用型Web服務(wù)器,多種瀏覽器可以正

2、常訪問SHTTPD上的網(wǎng)頁。,18.1.1 SHTTPD啟動(dòng)參數(shù)可動(dòng)態(tài)配置的需求,服務(wù)器dHTTP可以動(dòng)態(tài)配置啟動(dòng)參數(shù),例如服務(wù)器的偵聽端口、支持客戶端并發(fā)訪問的數(shù)量、超時(shí)時(shí)間的設(shè)置、訪問web網(wǎng)頁的路徑等。采用參數(shù)配置和文件配置兩種支持方式,在優(yōu)先級(jí)上,參數(shù)配置比文件配置的優(yōu)先級(jí)高,參數(shù)配置的選項(xiàng)值會(huì)覆蓋文件配置的選項(xiàng)。 1命令行參數(shù)配置 2文件配置,18.1.1 SHTTPD啟動(dòng)參數(shù)可動(dòng)態(tài)配置的需求,18.1.2 SHTTPD的多客戶端支持的需求,SHTTPD支持多個(gè)客戶端的并發(fā)連接,在同一時(shí)刻允許多個(gè)客戶端同時(shí)成功獲得服務(wù)器上的網(wǎng)頁資源,這是現(xiàn)代服務(wù)器的基本屬性。SHTTPD啟動(dòng)時(shí)的處理

3、單元初始化了兩個(gè),并發(fā)訪問數(shù)量為2,當(dāng)客戶端增加時(shí),會(huì)自動(dòng)根據(jù)現(xiàn)場(chǎng)情況增加處理單元,最大為4個(gè)。,18.1.2 SHTTPD的多客戶端支持的需求,18.1.3 SHTTPD支持方法的需求,HTTP協(xié)議中定義了八種方法,用來來表示對(duì)指定數(shù)據(jù)的操作的性質(zhì)和特點(diǎn): HEAD方法。 GET方法。 POST方法。 PUT上傳指定資源 DELETE 刪除指定資源 TRACE方法。 OPTIONS方法。 CONNECT方法。 HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)Get和Head方法,可能的話,也實(shí)現(xiàn)OPTIONS方法。,18.1.4 SHTTPD支持的HTTP協(xié)議版本的需求,超文本傳輸協(xié)議從開始出現(xiàn)到現(xiàn)在已經(jīng)演化出了

4、很多版本,它們中的大部分都是向下兼容的。在RFC 2145中描述了HTTP版本號(hào)的用法??蛻舳嗽谡?qǐng)求的時(shí)候先告訴服務(wù)器客戶端所采用的HTTP協(xié)議版本號(hào),而后者則在響應(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)容,本書中僅介紹幾個(gè)常用的頭域。 主機(jī)頭域: 參考頭域: 時(shí)間頭域: 范圍頭域: 用戶代理頭域:,18.1.6 SHTTPD定位URI的需求,URI是Universal Resource Identy的簡(jiǎn)寫,是同一資源標(biāo)識(shí)符的意思

5、,它是一種格式化的字符串,通過名稱、地址或者其他別的特征來確定網(wǎng)絡(luò)資源的位置。URI已經(jīng)廣為人知,例如WWW地址、通用文件標(biāo)識(shí)符、統(tǒng)一資源定位器(URL)、統(tǒng)一資源名稱(URN)等。 1URI的一般語法 2HTTP URL 3URI 比較,18.1.7 SHTTPD支持CGI的需求,CGI腳本是任何運(yùn)行在Web服務(wù)器上的程序,CGI是Common Gateway Interface的縮寫,“通用網(wǎng)關(guān)接口”的意思。簡(jiǎn)單的講,CGI腳本是一個(gè)可以運(yùn)行在Web服務(wù)器上的程序,有瀏覽器的輸入觸發(fā)。使用這種腳本,可以執(zhí)行服務(wù)器端的任何操作,但CGI腳本通常用于構(gòu)建服務(wù)器程序和其他系統(tǒng)程序,例如數(shù)據(jù)庫之間

6、的橋梁。 CGI腳本可能是一個(gè)腳本,或者一個(gè)二進(jìn)制可執(zhí)行程序,也就是說它可能是一個(gè)編譯好的程序或者批命令文件或者其他可執(zhí)行的東西。它的一個(gè)共同的特性是可以執(zhí)行并將結(jié)果反饋回來。 CGI腳本可以利用如下的兩種方法使用:作為一個(gè)表單的ACTION的響應(yīng)對(duì)象的URL。,18.1.8 SHTTPD錯(cuò)誤代碼的需求,錯(cuò)誤代碼,即狀態(tài)碼是試圖理解和滿足請(qǐng)求的三位數(shù)字的整數(shù)碼。狀態(tài)碼的第一位數(shù)字定義應(yīng)答類型,后兩位數(shù)字沒有任何類型任務(wù)。第一位數(shù)字有五種值: -1xx: 報(bào)告的,接收到請(qǐng)求,繼續(xù)進(jìn)程。 -2xx 成功,操作成功的收到。 -3xx 重發(fā),為了完成請(qǐng)求,必須采取進(jìn)一步措施。 -4xx 客戶端出錯(cuò),請(qǐng)

7、求包括錯(cuò)的順序或不能完成。 -5xx 服務(wù)器出錯(cuò),服務(wù)器無法完成顯然有效的請(qǐng)求。,18.2 SHTTPD的模塊分析和設(shè)計(jì),要實(shí)現(xiàn)SHTTPD服務(wù)器,需要對(duì)服務(wù)器的架構(gòu)和模塊進(jìn)行仔細(xì)的分析,例如客戶、服務(wù)器模式的選型,CGI的實(shí)現(xiàn)方法、命令行腳本的解析等。本節(jié)對(duì)18.1小結(jié)中的需求進(jìn)行仔細(xì)的分析,提供一種解決的方法。,18.2.1 SHTTPD的主函數(shù),為了更好的展示web服務(wù)器的架構(gòu),SHTTPD的主函數(shù)設(shè)計(jì)為十分簡(jiǎn)單的模型。主函數(shù)僅僅調(diào)用必要的功能函數(shù),具體細(xì)節(jié)有各功能函數(shù)實(shí)現(xiàn)。主函數(shù)完成四個(gè)部分的功能: 初始化服務(wù)器配置參數(shù)、套接字初始化的一些操作、運(yùn)行調(diào)度函數(shù)、掛接信號(hào)處理函數(shù)。,18.

8、2.1 SHTTPD的主函數(shù),18.2.2 SHTTPD命令行解析的分析設(shè)計(jì),服務(wù)器SHTTPD的命令行解析,需要進(jìn)行大量的命令行字符串解析,程序設(shè)計(jì)起來比較麻煩。 1函數(shù)getopt_long介紹 2SHTTPD中的命令行選項(xiàng)定義,18.2.2 SHTTPD命令行解析的分析設(shè)計(jì),18.2.3 SHTTPD配置文件解析的分析設(shè)計(jì),服務(wù)器SHTTPD的配置文件格式與一般的配置文件格式基本一致,即可以以#開頭的注釋行,或者按照關(guān)鍵字=值的格式書寫。格式如下: #注釋|空格關(guān)鍵字空格=空格value,18.2.3 SHTTPD配置文件解析的分析設(shè)計(jì),18.2.4 SHTTPD的多客戶端支持的分析設(shè)計(jì)

9、,服務(wù)器SHTTPD的多客戶端支持模塊為此程序的主處理模塊。在此模塊中進(jìn)行客戶端連接的處理、請(qǐng)求數(shù)據(jù)的接收、響應(yīng)數(shù)據(jù)的發(fā)送和服務(wù)線程的調(diào)度。模塊的核心部分采用線程池的服務(wù)器模型。,18.2.4 SHTTPD的多客戶端支持的分析設(shè)計(jì),18.2.5 SHTTPD頭部解析的分析設(shè)計(jì),HTTP請(qǐng)求的格式如下所示: METHOD URI HTTP/1|0.9|0|1rn 主要包含方法、URI、HTTP的版本,目前SHTTPD服務(wù)器所支持的方法僅為GET,因?yàn)镚ET方法可以滿足大部分的Web應(yīng)用。HTTP的版本,可以取值為0.9、1.0或者1.1。 可以用如下的方法可以獲得HTTP版本的主版本號(hào)和次版本號(hào)

10、: sscanf(p, HTTP/%lu.%lu, ,18.2.6 SHTTPD對(duì)URI的分析設(shè)計(jì),URI是客戶端請(qǐng)求主機(jī)網(wǎng)絡(luò)資源的位置,對(duì)于URI的分析主要包含如下需要特別進(jìn)行注意的部分: 資源位置的確定。請(qǐng)求主機(jī)的位置以“/”開始,其后為相對(duì)路徑,要注意請(qǐng)求的路徑中使用“./././”的形式取得請(qǐng)求范圍的擴(kuò)大。資源位置的最后一個(gè)“/”之后的字符串為實(shí)際請(qǐng)求的文件名,需要根據(jù)此文件名判定請(qǐng)求資源的類型,例如請(qǐng)求一個(gè)常規(guī)文件、請(qǐng)求一個(gè)目錄來獲得目錄下面所有文件的列表、請(qǐng)求CGI等。 URI資源中的“保留”和“危險(xiǎn)”字符集。此字符集中的字符字符等同于它們的“% HEX HEX”編碼,即對(duì)于一個(gè)以

11、“%”開頭的字符,需要進(jìn)行轉(zhuǎn)換后使用其正真的值。,18.2.7 SHTTPD支持方法的分析設(shè)計(jì),服務(wù)器dHTTP的方法僅支持GET,使用GET方法可以滿足大多數(shù)的靜態(tài)網(wǎng)頁的應(yīng)用。在對(duì)客戶端的請(qǐng)求進(jìn)行解析獲得請(qǐng)求的方法為GET后,服務(wù)器端的方法實(shí)現(xiàn)主要分為如下幾個(gè)部分: 頭部信息的組織。 文件內(nèi)容的發(fā)送。,18.2.8 SHTTPD支持CGI的分析設(shè)計(jì),Web服務(wù)器中的CGI是一段外部程序,它可以動(dòng)態(tài)的生成代碼,并可以接收輸入的參數(shù)。支持CGI主要分為如下幾個(gè)部分: CGI運(yùn)行程序和輸入?yún)?shù)的分析; 一個(gè)進(jìn)程運(yùn)行CGI程序,將CGI程序的輸出發(fā)給與客戶端通信的進(jìn)行; 與客戶端通信的進(jìn)行生成頭部信

12、息,并將CGI運(yùn)行進(jìn)行的輸出發(fā)給客戶端; CGI程序及參數(shù)的分析用于得到CGI程序和CGI程序運(yùn)行時(shí)的輸入?yún)?shù)。,18.2.8 SHTTPD支持CGI的分析設(shè)計(jì),18.2.9 SHTTPD錯(cuò)誤處理的分析設(shè)計(jì),當(dāng)用戶的請(qǐng)求發(fā)生錯(cuò)誤,或者服務(wù)器端發(fā)生錯(cuò)誤以及網(wǎng)絡(luò)傳輸過程中發(fā)生錯(cuò)誤時(shí),需要給客戶端發(fā)送合適的錯(cuò)誤信息,應(yīng)該包含錯(cuò)誤代碼和錯(cuò)誤含義。發(fā)送給出錯(cuò)客戶端的信息格式為: HTTP/主版本.副版本 錯(cuò)誤代碼 錯(cuò)誤信息rn Content-Type:內(nèi)容類型rn Content-Length:內(nèi)容長(zhǎng)度rn rn 錯(cuò)誤信息,18.2.9 SHTTPD錯(cuò)誤處理的分析設(shè)計(jì),18.3 SHTTPD各模塊的實(shí)

13、現(xiàn),Web服務(wù)器SHTTPD中實(shí)現(xiàn)的模塊有命令行解析、文件配置解析、多客戶端支持、URI解析、請(qǐng)求方法的解析、請(qǐng)求方法的響應(yīng)、CGI的支持、HTTP版本的支持、內(nèi)容類型的實(shí)現(xiàn)、錯(cuò)誤的處理方法、對(duì)目錄列表的顯示以及主函數(shù)的實(shí)現(xiàn),本節(jié)對(duì)上述的實(shí)現(xiàn)方法進(jìn)行介紹。,18.3.1 SHTTPD命令行解析的實(shí)現(xiàn),SHTTPD可以根據(jù)用戶的命令行輸入進(jìn)行服務(wù)器的配置。在解析用戶輸入的參數(shù)后,對(duì)默認(rèn)參數(shù)進(jìn)行修改來啟動(dòng)服務(wù)器。 1配置文件的結(jié)構(gòu) 2命令行解析結(jié)構(gòu) 3命令行解析代碼,18.3.2 SHTTPD文件配置解析的實(shí)現(xiàn),服務(wù)器SHTTPD配置文件的優(yōu)先級(jí)最高,對(duì)其進(jìn)行解析后的值覆蓋其他配置部分的值。單行配

14、置文件的格式為: 空格#注釋|空格關(guān)鍵字空格=空格value,18.3.3 SHTTPD的多客戶端支持的實(shí)現(xiàn),服務(wù)器SHTTPD的多客戶端支持框架的函數(shù)主要為Worker_ScheduleRun()和函數(shù)Worker_ScheduleStop(),這兩個(gè)函數(shù)通過對(duì)結(jié)構(gòu)struct worker_opts進(jìn)行管理來控制線程的狀態(tài)。結(jié)構(gòu)struct worker_opts的原型如下: struct worker_opts pthread_t th;/*線程的ID號(hào)*/ int flags;/*線程狀態(tài)*/ pthread_mutex_t mutex;/*線程任務(wù)互斥*/ struct worker

15、_ctl *work;/*本線程的總控結(jié)構(gòu)*/ ;,18.3.4 SHTTPD所請(qǐng)求URI解析的實(shí)現(xiàn),服務(wù)器SHTTPD中URI解析主要包含“有害”字符的替換,即將以“%”開始的字符進(jìn)行轉(zhuǎn)換。例如將“%20”轉(zhuǎn)換為“空格”。,18.3.5 SHTTPD方法解析的實(shí)現(xiàn),服務(wù)器SHTTPD請(qǐng)求方法的解析比較簡(jiǎn)單,使用比較字符串的方法。建立一個(gè)表示請(qǐng)求方法的結(jié)構(gòu)數(shù)組,逐個(gè)比較客戶端請(qǐng)求方法的字符串和數(shù)組中成員請(qǐng)求方法的異同。請(qǐng)求方法的結(jié)構(gòu)如下,ptr表示請(qǐng)求方法的名稱,len表示請(qǐng)求方法的長(zhǎng)度,type表示請(qǐng)求方法的類型: typedef struct vec char int len; SHTTP

16、D_METHOD_TYPE type; vec;,18.3.6 SHTTPD響應(yīng)方法的實(shí)現(xiàn),服務(wù)器SHTTPD可以識(shí)別的方法為GET、PUT、POST、DELETE和HEAD等,但僅實(shí)現(xiàn)了GET方法。在請(qǐng)求方法分析中已經(jīng)可以獲得客戶端請(qǐng)求的方法,在響應(yīng)中,只要匹配其方法就可以了。,18.3.7 SHTTPD支持CGI的實(shí)現(xiàn),CGI支持的實(shí)現(xiàn)主要包含CGI命令獲取、CGI參數(shù)獲取、管道進(jìn)程間連接、主進(jìn)程從CGI進(jìn)程讀取數(shù)據(jù)和發(fā)送數(shù)據(jù)、CGI進(jìn)程執(zhí)行并發(fā)送結(jié)果給主進(jìn)程。,18.3.8 SHTTPD支持HTTP協(xié)議版本的實(shí)現(xiàn),服務(wù)器SHTTPD支持的HTTP協(xié)議版本為0.9、1.0和1.1,當(dāng)協(xié)議的

17、版本不為此范圍時(shí),返回錯(cuò)誤值505,表示不支持的服務(wù)器版本。代碼如下: len -= pos -p; p = pos; sscanf(p, HTTP/%lu.%lu, ,18.3.9 SHTTPD內(nèi)容類型的實(shí)現(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錯(cuò)誤處理的實(shí)現(xiàn),服務(wù)器SHTTPD支持錯(cuò)誤值絕大多數(shù)的錯(cuò)誤響應(yīng),其錯(cuò)誤代碼定義如下: 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生成目錄下文件列表文件的實(shí)現(xiàn),當(dāng)客戶端請(qǐng)求的是一個(gè)目錄名的時(shí)候,需要判斷是否當(dāng)前目錄下有一個(gè)與默認(rèn)文件名一致的文件。如果沒有,則需要將當(dāng)前目錄下面的所有目錄列表出來,并形成超級(jí)鏈接。,18.3.12 SHTTPD主函數(shù)的實(shí)現(xiàn),服務(wù)器SHTTPD的主函數(shù)代碼如下,主要功能為掛接SIGINT信號(hào)、初始化參數(shù)配置、服務(wù)器套接字初始操作,然后執(zhí)行工作調(diào)度任務(wù)。 int main(int argc, char *argv) signal(SIGINT, sig_int);/*掛接信號(hào)SIGINT*/ Para_Init(argc,argv);/*參數(shù)初始

21、化*/ int s = do_listen();/*套接字初始化*/ Worker_ScheduleRun(s);/*任務(wù)調(diào)度*/ return 0; ,18.4 SHTTPD的編譯、調(diào)試和測(cè)試,本節(jié)在之前的代碼的基礎(chǔ)上建立源代碼文件、建立Makefile、對(duì)文件進(jìn)行編譯,然后對(duì)SHTTPD服務(wù)器進(jìn)行測(cè)試。,18.4.1 建立源文件,源文件主要有如下幾個(gè),數(shù)據(jù)結(jié)構(gòu)基本都在shttpd.h中放置;配置參數(shù)的解析和獲得在shttpd_parameters.c文件中實(shí)現(xiàn);主函數(shù)在shttpd.c中實(shí)現(xiàn);客戶端請(qǐng)求的業(yè)務(wù)處理在文件shttpd_worker.c中;關(guān)于URI的分析在文件shttpd_uri.c文件中;而文件shttpd_request.c中則是對(duì)客戶端請(qǐng)求的分析;shttpd_mine.c中放置的是請(qǐng)求內(nèi)容的類別相關(guān)變量和函數(shù);shttpd_error.c中的代碼為HTTP協(xié)議的錯(cuò)誤處理函數(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論