http服務(wù)器的設(shè)計與實現(xiàn)_第1頁
http服務(wù)器的設(shè)計與實現(xiàn)_第2頁
http服務(wù)器的設(shè)計與實現(xiàn)_第3頁
http服務(wù)器的設(shè)計與實現(xiàn)_第4頁
http服務(wù)器的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、網(wǎng)絡(luò)課程設(shè)計實驗報告題 目: HTTP服務(wù)器的設(shè)計及實現(xiàn) 姓 名: 孫宇飛、莊好濤、王斌 學(xué) 院: 信息科學(xué)技術(shù)學(xué)院 專 業(yè): 計算機科學(xué)與技術(shù) 班 級: 計科82班 學(xué) 號: 、 指導(dǎo)老師: 葉錫君 職稱: 副教授 2011 年 9 月 11 日南京農(nóng)業(yè)大學(xué)教務(wù)處制目錄目錄1.設(shè)計任務(wù)及要求11.1設(shè)計目的11.2設(shè)計要求12.工作原理及設(shè)計方案12.1工作原理12.2設(shè)計方案22.3 開發(fā)環(huán)境22.4程序流程圖22.5 核心代碼42.4.1 主程序42.4.2 請求處理函數(shù)52.4.3 無法響應(yīng)請求62.4.4 404響應(yīng)62.4.5 判斷是否是目錄72.4.6 判斷文件是否存在72.4.

2、8 判斷文件類型82.4.9 執(zhí)行CGI程序92.4.10 判斷請求的是否是cgi程序93.實驗驗證113.1實驗設(shè)備及材料113.2實驗步驟113.3 實驗截圖113.4實驗結(jié)果134.思考和總結(jié)131.設(shè)計任務(wù)及要求1.1設(shè)計目的運用數(shù)據(jù)通信及網(wǎng)絡(luò)課程所學(xué)的知識,設(shè)計一個簡單的http服務(wù)器,在實現(xiàn)的過程中繼續(xù)深入了解網(wǎng)絡(luò)通信的原理,鍛煉UNIX環(huán)境下網(wǎng)絡(luò)編程的能力,熟悉socket編程原理和http協(xié)議,從而鞏固所學(xué)網(wǎng)絡(luò)知識。1.2設(shè)計要求1) 要能實現(xiàn)get方法;2) 能響應(yīng)請求的html頁面;3) 還能夠響應(yīng)請求的jpg的等圖片文件;4) 能響應(yīng)請求的目錄的信息,并以列表顯示;2.工

3、作原理及設(shè)計方案2.1工作原理HTTP協(xié)議工作流程:1.首先客戶機與服務(wù)器需要建立連接。只要單擊某個超級鏈接,HTTP的工作就開始了。2.建立連接后,客戶機發(fā)送一個請求給服務(wù)器,請求方式的格式為:統(tǒng)一資源標(biāo)識符(URL)、協(xié)議版本號,后邊是MIME信息:包括請求修飾符、客戶機信息和可能的內(nèi)容。 3.服務(wù)器接到請求后,給予相應(yīng)的響應(yīng)信息,其格式為一個狀態(tài)行,包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務(wù)器信息、實體信息和可能的內(nèi)容。 4.客戶端接收服務(wù)器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客http工作流程圖戶機與服務(wù)器斷開連接。  2.2設(shè)計方案協(xié)

4、議版本號:使用HTTP 1.0請求方法:僅實現(xiàn)get方法響應(yīng)文件的類型:text/plain,image/gif,image/jpg,image/jpeg工作模式:多進(jìn)程模式,每個進(jìn)程單獨處理一個請求。2.3 開發(fā)環(huán)境Vmware Workstation 6.5 虛擬機下FreeBSD環(huán)境,用C語言進(jìn)行開發(fā),開發(fā)工具包括:vim,gcc,gdb。2.4程序流程圖創(chuàng)建socket連接接收client連接讀取client請求處理請求關(guān)閉socket循環(huán) 圖1.主程序Fork() != 0退出YN響應(yīng)501錯誤GET方法?NY請求對象存在?響應(yīng)404錯誤YN請求對象為目錄?響應(yīng)目錄信息YN請求對象為

5、CGI交給CGI程序執(zhí)行YN響應(yīng)請求的文件返回圖2.請求處理程序2.5 核心代碼2.4.1 主程序int main ( int argc, char *argv ) int sock, fd; FILE *fpin; char requestBUFSIZ; if ( argc = 1 ) fprintf( stderr, "usage: webserv portn" ); exit(1); /* 創(chuàng)建socket連接 */ sock = make_server_socket( atoi( argv1 ) ); if ( sock = -1) exit(2); /* 主循環(huán)

6、*/ while( 1 ) /接收socket fd = accept( sock, NULL, NULL ); fpin = fdopen ( fd, "r" ); /讀取請求 fgets( request, BUFSIZ, fpin ); printf( "got a call: request = %s",request ); read_til_crnl( fpin ); /處理請求 process_rq( request, fd ); /關(guān)閉socket fclose( fpin ); return 0; 請求處理函數(shù)int process_rq

7、 ( char *rq, int fd)/加void會報警告不知道為什么? char cmdBUFSIZ, argBUFSIZ; /* 創(chuàng)建一個新進(jìn)程,如果不是子進(jìn)程則直接返回 */ if ( fork() != 0 ) return -1; strcpy(arg, "./");/加上./前綴 if ( sscanf( rq, "%s%s", cmd, arg+2 ) != 2 ) return -1; if ( strcmp( cmd, "GET") != 0 ) cannot_do( fd ); else if ( not_exi

8、st ( arg ) do_404( arg, fd ); else if ( isadir ( arg ) ) do_ls( arg, fd ); else if (ends_in_cgi ( arg ) ) do_exec( arg, fd ); else do_cat( arg, fd ); return 0;/* - end of function process_rq - */ 無法響應(yīng)請求int cannot_do ( int fd ) FILE *fp = fdopen( fd, "w" ); fprintf( fp, "HTTP/1.0 501 N

9、ot Implementedrn" ); fprintf( fp, "Content-type: text/plainrn" ); fprintf( fp, "rn" ); fprintf( fp, "That command is not yet implementedrn" ); fclose( fp ); return 0;/* - end of function cannot_do - */2.4.4 404響應(yīng)/* * 函數(shù)名: do_404 * 描述: * 參數(shù): * 返回值: */int do_404 ( ch

10、ar *item, int fd ) FILE *fp = fdopen( fd, "w" ); fprintf( fp, "HTTP/1.0 404 Not Foundrn" ); fprintf( fp, "Content-type: text/plainrn" ); fprintf( fp, "rn" ); fprintf( fp, "The item you requested: %srnis not foundrn" , item); fclose( fp ); return 0;/*

11、 - end of function do_404 - */ 判斷是否是目錄/* * 函數(shù)名: isadir * 描述: * 參數(shù): * 返回值: */int isadir ( char *f ) struct stat info; return ( stat( f, &info ) != -1 && S_ISDIR(info.st_mode) );/* - end of function isadir - */ 判斷文件是否存在/* * 函數(shù)名: not_exist * 描述: * 參數(shù): * 返回值: */int not_exist ( char *f ) stru

12、ct stat info; return ( stat( f, &info ) = -1 );/* - end of function not_exist - */ 列出目錄信息/* * 函數(shù)名: do_ls * 描述: * 參數(shù): * 返回值: */do_ls ( char *dir, int fd ) FILE *fp; fp = fdopen( fd, "w" ); header( fp, "text/plain" ); fprintf( fp, "rn" ); fflush( fp ); dup2( fd, STDOU

13、T_FILENO ); dup2( fd, STDERR_FILENO ); close( fd ); execlp( "ls", "ls", "-l", dir, NULL); perror( dir ); exit( 1 );/* - end of function do_ls - */ 判斷文件類型/* * 函數(shù)名: file_type * 描述: 返回文件后綴名 * 參數(shù): * 返回值: */char * file_type ( char *f ) char *cp; if ( ( cp = strrchr( f, '

14、.' ) ) != NULL ) return cp+1; return ""/* - end of function file_type - */ 執(zhí)行CGI程序/* * 函數(shù)名: do_exec * 描述: * 參數(shù): * 返回值: */int do_exec ( char *prog, int fd ) FILE *fp; fp = fdopen( fd, "w" ); header( fp, NULL ); fflush( fp ); dup2( fd, 1 ); dup2( fd, 2 ); close( fd ); execl( pr

15、og, prog, NULL ); perror( prog ); return 0;/* - end of function do_exect - */ 判斷請求的是否是cgi程序/* * 函數(shù)名: ends_in_cgi * 描述: * 參數(shù): * 返回值: */int ends_in_cgi ( char *f ) return ( strcmp( file_type( f ), "cgi" ) = 0 );/* - end of function ends_in_cgi - */ 返回請求的文件/* * 函數(shù)名: do_cat * 描述: 發(fā)送回包的主體,緊跟在ht

16、tp消息頭后 * 參數(shù): * 返回值: */int do_cat ( char *f, int fd ) char *extension = file_type( f ); char *content = "text/plain" FILE *fpsock, *fpfile; int c; if ( strcmp(extension, "html" ) = 0 ) content = "text/html" else if ( strcmp( extension, "gif") = 0 ) content = &q

17、uot;image/gif" else if ( strcmp( extension, "jpg" ) = 0 ) content = "image/jpeg" else if ( strcmp( extension, "jpeg" ) = 0 ) content = "image/jpeg" fpsock = fdopen( fd, "w" ); fpfile = fopen ( f, "r" ); if ( fpsock != NULL && f

18、pfile != NULL ) header( fpsock, content ); fprintf( fpsock,"rn" ); while( ( c = getc( fpfile) ) != EOF ) putc( c, fpsock ); fclose( fpfile ); fclose ( fpsock ); return 0;/* - end of function do_cat - */3.實驗驗證3.1實驗設(shè)備及材料局域網(wǎng)環(huán)境下,使用一臺FreeBSD系統(tǒng)PC作為服務(wù)器,若干臺PC作為客戶機,使用IE瀏覽器請求服務(wù)器。3.2實驗步驟1.啟動服務(wù)器。2.客戶機在瀏覽器地址欄輸入“服務(wù)器IP:端口號/請求文件名”。3.觀察服務(wù)器響應(yīng)的內(nèi)容并記錄。3.3 實驗截圖1.啟動服務(wù)器。2.請求html文件3.請求jpg文件4.顯示目錄文件:3.4實驗結(jié)果客戶機請求后服務(wù)器后,能夠正常顯示所請求的網(wǎng)頁、圖片和目錄的信息。4.思考和總結(jié)經(jīng)過一星期的努力,我們的小型http服務(wù)器已經(jīng)能夠顯示網(wǎng)頁和圖片了,并且能夠返回當(dāng)前目錄的信息了,但是沒有來得及加入CGI功能,在機房實驗時因為網(wǎng)絡(luò)的原因,沒有演示成功

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論