LINUX系統(tǒng)的嵌入式WEB服務(wù)器的設(shè)計(jì)_第1頁(yè)
LINUX系統(tǒng)的嵌入式WEB服務(wù)器的設(shè)計(jì)_第2頁(yè)
LINUX系統(tǒng)的嵌入式WEB服務(wù)器的設(shè)計(jì)_第3頁(yè)
LINUX系統(tǒng)的嵌入式WEB服務(wù)器的設(shè)計(jì)_第4頁(yè)
LINUX系統(tǒng)的嵌入式WEB服務(wù)器的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

...wd......wd......wd...*******************實(shí)踐教學(xué)*******************蘭州理工大學(xué)計(jì)算機(jī)與通信學(xué)院2015年春季學(xué)期嵌入式系統(tǒng)開(kāi)發(fā)課程設(shè)計(jì)題目:基于LINUX系統(tǒng)的嵌入式WEB服務(wù)器的設(shè)計(jì)專業(yè)班級(jí):通信工程12級(jí)1班姓名:王愛(ài)強(qiáng)學(xué)號(hào):12250110指導(dǎo)教師:張璽君成績(jī):目錄TOC\o"1-3"\h\u18475摘要119753前言224889一、基本原理3315811.1嵌入式WEB服務(wù)器概述3111721.2SOCKET編程概述422953二、系統(tǒng)分析687642.1整體構(gòu)造圖6253592.2連接處理模塊622950三、詳細(xì)設(shè)計(jì)7288303.1主程序設(shè)計(jì)724763.2客戶連接處理模塊設(shè)計(jì)8312483.3客戶請(qǐng)求解析處理模塊設(shè)計(jì)8138063.4發(fā)送協(xié)議數(shù)據(jù)頭模塊設(shè)計(jì)923585四、運(yùn)行結(jié)果116479參考文獻(xiàn)1423264總結(jié)1520880致謝161864附錄17摘要嵌入式Web服務(wù)器主要用于遠(yuǎn)程監(jiān)測(cè)和控制,它不同于傳統(tǒng)的Web服務(wù)器,硬件處理器能力和儲(chǔ)存能力有限,因此操作系統(tǒng)等相關(guān)軟件需要進(jìn)展裁剪以適應(yīng)嵌入式環(huán)境,開(kāi)源代碼的操作系統(tǒng)Linu型具有強(qiáng)大的網(wǎng)絡(luò)服務(wù)功能,支持多種網(wǎng)絡(luò)接口和網(wǎng)絡(luò)協(xié)議棧,同時(shí)具有成本低性能穩(wěn)定,擴(kuò)大能力強(qiáng)等特點(diǎn),成為嵌入式操作系統(tǒng)的首選。關(guān)鍵詞:Linux;Web服務(wù)器;瀏覽器;穿插編譯前言嵌入式系統(tǒng)已經(jīng)成熟并且得到了廣泛地使用。在傳統(tǒng)的測(cè)控系統(tǒng)中,為了實(shí)現(xiàn)多個(gè)測(cè)控點(diǎn)之間的信息交流,一般采用RS-485、CAN、SPI等總線將多個(gè)測(cè)控節(jié)點(diǎn)組織成一個(gè)網(wǎng)絡(luò),但是這樣的網(wǎng)絡(luò)專用性太強(qiáng),有效地通信范圍太窄,而基于TCP/IP協(xié)議的Web技術(shù)得到了普及,更重要的是這些協(xié)議是可開(kāi)發(fā)的、標(biāo)準(zhǔn)的、獨(dú)立于平臺(tái)的。把嵌入式系統(tǒng)和與Web技術(shù)結(jié)合在一起,將Web技術(shù)引入到測(cè)量和控制系統(tǒng)中,實(shí)現(xiàn)基于嵌入式Web服務(wù)器的遠(yuǎn)程控制系統(tǒng),必將有良好地應(yīng)用前景。嵌入式系統(tǒng)離不開(kāi)嵌入式操作系統(tǒng)。目前商用的操作系統(tǒng)往往價(jià)格昂貴,不適應(yīng)廣泛應(yīng)用。嵌入式Linux操作系統(tǒng)源碼可開(kāi)發(fā)。移植性好,支持多種硬件平臺(tái)并且支持幾乎所有的常見(jiàn)網(wǎng)絡(luò)通信協(xié)議支持的文件系統(tǒng)也很豐富,是一個(gè)功能完整的嵌入式操作系統(tǒng)并且有大量的優(yōu)秀開(kāi)發(fā)碼源的應(yīng)用軟件和開(kāi)發(fā)工具可以使用。因此,采用Linux作為平臺(tái),使用Web技術(shù)進(jìn)展遠(yuǎn)程在線測(cè)控系統(tǒng)的設(shè)計(jì)。一、基本原理1.1嵌入式WEB服務(wù)器概述1)WEB服務(wù)器通常是在遠(yuǎn)程機(jī)器上,負(fù)責(zé)對(duì)瀏覽器頁(yè)面請(qǐng)求作出響應(yīng),返回HTML編碼或類似的數(shù)據(jù)流。通俗的講,Web服務(wù)器傳送(serves)頁(yè)面使瀏覽器可以瀏覽,然而應(yīng)用程序服務(wù)器提供的是客戶端應(yīng)用程序可以調(diào)用(call)的方法(methods)。確切一點(diǎn),你可以說(shuō):Web服務(wù)器專門(mén)處理請(qǐng)求(request),但是應(yīng)用程序服務(wù)器是通過(guò)很多協(xié)議來(lái)為應(yīng)用程序提供(serves)商業(yè)邏輯(businesslogic)。隨著Internet技術(shù)的興起,在嵌入式設(shè)備的管理與交互中,基于Web方式的應(yīng)用成為目前的主流,這種程序構(gòu)造也就是大家非常熟悉的B/S構(gòu)造,即在嵌入式設(shè)備上運(yùn)行一個(gè)支持腳本或CGI功能的Web服務(wù)器,能夠生成動(dòng)態(tài)頁(yè)面,在用戶端只需要通過(guò)Web瀏覽器就可以對(duì)嵌入式設(shè)備進(jìn)展管理和監(jiān)控,非常方便實(shí)用。2)WEB瀏覽器WEB瀏覽器是個(gè)顯示網(wǎng)頁(yè)伺服器或檔案系統(tǒng)內(nèi)的HTML文件,并讓用戶與此些文件互動(dòng)的一種軟件。個(gè)人電腦上常見(jiàn)的網(wǎng)頁(yè)瀏覽器包括微軟的InternetExplorer、Mozilla的Firefox、Opera和Safari。瀏覽器是最經(jīng)常使用到的客戶端程序。3)嵌入式WEB服務(wù)器架構(gòu)圖1嵌入式WEB服務(wù)器架構(gòu)常見(jiàn)的嵌入式WEB服務(wù)器有l(wèi)igd、sd、td、boa、mathopd、minid、appweb、goahead等上百種。1.2SOCKET編程概述現(xiàn)在大多數(shù)的操作系統(tǒng)都提供了已編譯好了的網(wǎng)絡(luò)通訊程序。TCP/IP范圍內(nèi)最普通的例子就是web客戶端(瀏覽器)和web服務(wù)器,還有就是FTP和Telnet的客戶端和服務(wù)器等。Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來(lái)開(kāi)發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。SOCKET編程接口#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol);說(shuō)明:socket()函數(shù)創(chuàng)立一個(gè)套接字參數(shù):domain:應(yīng)用程序所在主機(jī)使用的通信協(xié)議族type:建設(shè)的套接字的類型Protocol:使用的特定協(xié)議#include<sys/socket.h>intbind(intsockfd,structsockaddr*my_addr,socklen_taddrlen);說(shuō)明:將套接字地址與所創(chuàng)立的套接字號(hào)聯(lián)系起來(lái)參數(shù):sockfd:調(diào)用socket返回的文件描述符my_addr:指向數(shù)據(jù)構(gòu)造structsockaddr的指針,它保存地址(即端口和IP地址)信息addrlen:設(shè)置為sizeof(structsockaddr)#include<sys/socket.h>intconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);說(shuō)明:建設(shè)套接字連接,成功返回0,失敗返回-1參數(shù):sockfd:調(diào)用socket返回的文件描述符serv_addr:保存著目的地端口和IP地址的數(shù)據(jù)構(gòu)造structsockaddraddrlen:設(shè)置為sizeof(structsockaddr)#include<sys/socket.h>intlisten(ints,intbacklog);說(shuō)明:用于面向連接服務(wù)器,說(shuō)明它愿意接收連接參數(shù):sockfd:調(diào)用socket返回的文件描述符backlog:在進(jìn)入隊(duì)列中允許的連接數(shù)目,在發(fā)生錯(cuò)誤的時(shí)候返回-1#include<sys/socket.h>intaccept(ints,structsockaddr*addr,socklen_t*addrlen);說(shuō)明:建設(shè)套接字連接,成功返回文件描述符,失敗-1參數(shù):sockfd:調(diào)用socket返回的文件描述符addr:指向局部的數(shù)據(jù)構(gòu)造sockaddr_in的指針addrlen:設(shè)置為sizeof(structsockaddr_in)#include<sys/types.h>#include<sys/socket.h>ssize_tsend(ints,constvoid*buf,size_tlen,intflags);說(shuō)明:用于流式套接字或者數(shù)據(jù)報(bào)套接字的通訊,返回實(shí)際發(fā)送的數(shù)據(jù)的字節(jié)數(shù),它在錯(cuò)誤的時(shí)候返回-1參數(shù):sockfd:發(fā)送數(shù)據(jù)的套接字描述符〔或者是調(diào)用socket()或者accept())msg :指向發(fā)送數(shù)據(jù)的指針len :數(shù)據(jù)長(zhǎng)度f(wàn)lags:總是設(shè)置為0#include<sys/types.h>#include<sys/socket.h>ssize_trecv(ints,void*buf,size_tlen,intflags);說(shuō)明:用于流式套接字的通訊,recv()返回實(shí)際讀入緩沖 的數(shù)據(jù)的字節(jié)數(shù)。或者在錯(cuò)誤的時(shí)候返回-1參數(shù):sockfd:要讀的SOCKET描述符buf :要讀的信息的緩沖區(qū)len :緩沖的最大長(zhǎng)度f(wàn)lags:總是設(shè)置為0二、系統(tǒng)分析2.1整體構(gòu)造圖主程序:建設(shè)TCP類型SOCKET在80端口進(jìn)展監(jiān)聽(tīng)連接請(qǐng)求。接收到連接請(qǐng)求,將請(qǐng)求傳送給連接處理模塊處理。并繼續(xù)進(jìn)展監(jiān)聽(tīng)。如圖2所示:圖2整體流程2.2連接處理模塊圖3連接處理模塊三、詳細(xì)設(shè)計(jì)3.1主程序設(shè)計(jì)1〕功能說(shuō)明系統(tǒng)的總?cè)肟?,也是系統(tǒng)的主要控制函數(shù)。分別完成如下功能:建設(shè)環(huán)境設(shè)置。設(shè)置信號(hào)處理方式。建設(shè)偵聽(tīng)TCP流方式SOCKET并綁定80端口。建設(shè)連接偵聽(tīng)及客戶連接處理調(diào)用主循環(huán)。2〕算法流程圖算法流程圖如圖4所示:圖4算法流程圖3〕命令行輸入處理用戶在命令行輸入?yún)?shù)-i,那么將客戶輸入文件描述字設(shè)為0,即標(biāo)準(zhǔn)輸入。用于在本機(jī)進(jìn)展測(cè)試。其他輸入全部忽略。3.2客戶連接處理模塊設(shè)計(jì)1〕功能說(shuō)明用于初步處理客戶的連接請(qǐng)求,并將請(qǐng)求信息傳遞給客戶請(qǐng)求解析函數(shù)處理。2〕算法具體算法如圖5所示:圖5算法流程圖3.3客戶請(qǐng)求解析處理模塊設(shè)計(jì)1〕功能說(shuō)明用于解析客戶的請(qǐng)求,并根據(jù)請(qǐng)求信息調(diào)用相應(yīng)的函數(shù)進(jìn)展請(qǐng)求處理。2〕算法算法流程圖如圖6所示:圖6算法流程圖3.4發(fā)送協(xié)議數(shù)據(jù)頭模塊設(shè)計(jì)1〕功能說(shuō)明根據(jù)參數(shù)的不同,發(fā)送不同的協(xié)議頭信息。2〕算法函數(shù)定義為:intPrintHeader(FILE*f,intcontent_type)發(fā)送請(qǐng)求成功信息:/1.0200OK。根據(jù)文檔類型發(fā)送相應(yīng)的信息:fprintf(),函數(shù)中的第一個(gè)參數(shù)f為客戶連接文件流句柄。switch(content_type){case't':fprintf(f,"Content-type:text/plain\n");break;case'g':fprintf(f,"Content-type:image/gif\n");break;case'j':fprintf(f,"Content-type:image/jpeg\n");break;case'h':fprintf(f,"Content-type:text/html\n");break;}發(fā)送服務(wù)器信息:fprintf(f,"Server:AMRLinux-d0.2.4\n");發(fā)送文件過(guò)期為永不過(guò)期:fprintf(f,"Expires:0\n");四、運(yùn)行結(jié)果1、進(jìn)入目錄:[root@localhost/]#cd/UP-CUP210-II/SRC/exp/basic/04_webserver/[root@localhost04_webserver]#lsGoogleMakefilecopy.ccopy.odocdd.cd.oindex.html[root@localhost04_webserver]#2、去除中間代碼,重新編譯[root@localhost04_webserver]#makecleanrm-f../bin/d./d*.elf*.gdb*.o[root@localhost04_webserver]#makearm-linux-gcc-DD_DOCUMENT_ROOT=\"/mnt/yaffs\"-c-od.od.carm-linux-gcc-DD_DOCUMENT_ROOT=\"/mnt/yaffs\"-c-ocopy.ocopy.carm-linux-gcc-static-o../bin/dd.ocopy.o-lpthreadarm-linux-gcc-static-odd.ocopy.o-lpthread[root@localhost04_webserver]#lsGoogleMakefilecopy.ccopy.odocdd.cd.oindex.html當(dāng)前目錄下生成可執(zhí)行程序d。4、啟動(dòng)UP-CUP210-II型實(shí)驗(yàn)系統(tǒng),連好網(wǎng)線、串口線。通過(guò)串口終端掛載宿主機(jī)實(shí)驗(yàn)?zāi)夸?。[root@UP-TECHyaffs]#mountnfs57:/UP-CUP210-II/mnt/nfs/6、進(jìn)入串口終端的NFS共享實(shí)驗(yàn)?zāi)夸?。[root@UP-TECHyaffs]#cd/mnt/nfs/SRC/exp/basic/04_webserver/[root@UP-TECH04_webserver]#lsGooglecopy.cdocd.cindex.htmlMakefilecopy.odd.o[root@UP-TECH04_webserver]#6、執(zhí)行程序,啟動(dòng)服務(wù)器。[root@UP-TECH04_webserver]#./dstartingd...pressqtoquit.waitforconnection.此時(shí)UP-CUP210-II型設(shè)備端服務(wù)器啟動(dòng)并等待連接。翻開(kāi)PC機(jī)WindowsXP系統(tǒng)上的IE瀏覽器,在地址欄輸入U(xiǎn)P-CUP210-II型設(shè)備IP地址:://99。如圖7所示:圖7輸入IP地址輸入正確的IP地址即可訪問(wèn)UP-CUP210-II型設(shè)備上提供的服務(wù)。結(jié)果如下:ARM端:[root@UP-TECH04_webserver]#./dstartingd...pressqtoquit. waitforconnection.buf='GET//1.1Gotbuf1'Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,'Gotbuf1'application/msword,*/*'Gotbuf1'Accept-Language:zh-cn'Gotbuf1'Accept-Encoding:gzip,deflate'Gotbuf1'User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;QQPinyinSetup620;CIBA;MAXTHON2.0)'Gotbuf1'Host:99'Gotbuf1'Connection:Keep-Alive'瀏覽器端:如圖8所示:圖8瀏覽器端顯示參考文獻(xiàn)[1]孫天澤,袁文菊,張海峰.嵌入式設(shè)計(jì)及Linux驅(qū)動(dòng)開(kāi)發(fā)指南—基于ARM9處理器[M].北京:電子工業(yè)出版社,2005[2]于明,范書(shū)瑞,曾祥燁.ARM9嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)教程[M].北京:電子工業(yè)出版社,2006[3]王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2003[4]SamsungElectronics.S3C2410X32-BitRISCMicroprocessorUser’sManual,2003[5]周立功等.ARM嵌入式Linux系統(tǒng)構(gòu)建與驅(qū)動(dòng)開(kāi)發(fā)范例.北京:北京航空航天大學(xué)出版社,2006[6]鄭慕德.編著?嵌入式微型計(jì)算機(jī)系統(tǒng)實(shí)例教程-ARM與LINUX?.科學(xué)出版社2006.7[7]王進(jìn)德.編著?嵌入式LINUX程序設(shè)計(jì)與應(yīng)用案例?.中國(guó)電力出版社,2007.5[8]王學(xué)龍著.嵌入式LINUX系統(tǒng)設(shè)計(jì)與應(yīng)用[M].北京:清華大學(xué)出版社,2001[9]林宇,郭凌云.LINUX網(wǎng)絡(luò)編程[M].北京:人民郵電出版社,2000[10]張斌,高波等.LINUX網(wǎng)絡(luò)編程[M].北京:清華大學(xué)出版社,2000總結(jié)兩周的課設(shè)在不知不覺(jué)中已經(jīng)完畢了,雖說(shuō)時(shí)間不長(zhǎng),但是收獲頗豐,不僅學(xué)到了一些新知識(shí),穩(wěn)固了以前學(xué)習(xí)的內(nèi)容,增強(qiáng)了我的動(dòng)手操作調(diào)試能力。雖說(shuō)一些技術(shù)我們?cè)谡n堂上野曾經(jīng)學(xué)習(xí)過(guò),但是大都停留在理論學(xué)習(xí)上,實(shí)際開(kāi)發(fā)很少,而這次課程設(shè)計(jì)給了我們一個(gè)很好的邊學(xué)習(xí)邊實(shí)踐的時(shí)機(jī),對(duì)我們深入學(xué)習(xí)這些技術(shù)有很大的幫助,深刻體會(huì)到了這些技術(shù)的實(shí)用性。本次課程設(shè)計(jì)利用實(shí)驗(yàn)室提供的博創(chuàng)經(jīng)典UP-CUP210-II型嵌入式實(shí)驗(yàn)平臺(tái),通過(guò)上位機(jī)編程控制下位機(jī)進(jìn)展web服務(wù)器的設(shè)計(jì),使用C語(yǔ)言編程,生成目標(biāo)文件,并且通過(guò)對(duì)宿主機(jī)下位機(jī)的相關(guān)上機(jī)操作,實(shí)現(xiàn)對(duì)書(shū)本內(nèi)容的實(shí)際操作,穩(wěn)固加深對(duì)嵌入式系統(tǒng)的認(rèn)知和了解,最終在此根基上進(jìn)展創(chuàng)新設(shè)計(jì),了解了一個(gè)實(shí)際的網(wǎng)絡(luò)通訊應(yīng)用程序整體設(shè)計(jì)后,我們共同編寫(xiě)C程序?qū)崿F(xiàn)對(duì)服務(wù)器的訪問(wèn)。經(jīng)過(guò)這段時(shí)間的學(xué)習(xí)、系統(tǒng)分析、方案論證、硬件和軟件設(shè)計(jì)、調(diào)試等的努力,完成了嵌入式web服務(wù)器的設(shè)計(jì)制作。在系統(tǒng)的設(shè)計(jì)制作過(guò)程中,確實(shí)遇到了各種各樣的問(wèn)題,如調(diào)試思路正確但是沒(méi)有能夠進(jìn)展找到適宜的方法進(jìn)展進(jìn)一步的實(shí)驗(yàn),設(shè)計(jì)中對(duì)于程序的編寫(xiě)以及目錄構(gòu)造的認(rèn)知上存在偏差,其主要原因還是根基功不扎實(shí),把握系統(tǒng)的能力缺乏,這為我們以后的學(xué)習(xí)和工作提了一個(gè)醒。在問(wèn)題的解決過(guò)程中,也提高了我的動(dòng)手動(dòng)腦能力,學(xué)到了許多在書(shū)本上學(xué)不到的知識(shí)。在具體的設(shè)計(jì)當(dāng)中解決了諸如d服務(wù)器的搭建和C程序的修改,程序的調(diào)試和系統(tǒng)的整體認(rèn)識(shí)等問(wèn)題,收獲很大。做課程設(shè)計(jì)是一次再系統(tǒng)的學(xué)習(xí),課程設(shè)計(jì)的完成,讓我在其中學(xué)到了許多,尤其是學(xué)會(huì)了合作,懂得了合作早就的效益和成果。在這里再次感謝和我一起伙伴的同學(xué),還有對(duì)我們精心指導(dǎo)的教師!致謝通過(guò)近兩周的努力,我們的課程設(shè)計(jì)終于完成了,這意味著這一階段艱辛的熱烈的付出即將告一段落。在整個(gè)課程設(shè)計(jì)中,我在學(xué)習(xí)上和思想上都受益匪淺,這除了自身的努力外,與指導(dǎo)的教師、同學(xué)的關(guān)心、支持和鼓勵(lì)是分不開(kāi)的。做課程設(shè)計(jì)是一次再系統(tǒng)的學(xué)習(xí),課程設(shè)計(jì)的完成,讓我在其中學(xué)到了許多,尤其是學(xué)會(huì)了合作,懂得了合作早就的效益和成果。在這里再次感謝和我一起伙伴的同學(xué),還有對(duì)我們精心指導(dǎo)的教師!附錄d.c#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<errno.h>#include<sys/stat.h>#include<dirent.h>#include<signal.h>#include<unistd.h>#include<ctype.h>#include"pthread.h"#defineDEBUGintKEY_QUIT=0;intTIMEOUT=30;#ifndefO_BINARY#defineO_BINARY0#endifcharreferrer[128];intcontent_length;#defineSERVER_PORT80intPrintHeader(FILE*f,intcontent_type){alarm(TIMEOUT);fprintf(f,"/1.0200OK\n");switch(content_type){case't':fprintf(f,"Content-type:text/plain\n");break;case'g':fprintf(f,"Content-type:image/gif\n");break;case'j':fprintf(f,"Content-type:image/jpeg\n");break;case'h':fprintf(f,"Content-type:text/html\n");break;}fprintf(f,"Server:uClinux-d0.2.2\n");fprintf(f,"Expires:0\n");fprintf(f,"\n");alarm(0);return(0);}intDoJpeg(FILE*f,char*name){char*buf;FILE*infile;intcount;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"UnabletoopenJPEGfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'j'); copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intDoGif(FILE*f,char*name){char*buf;FILE*infile;intcount;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"UnabletoopenGIFfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'g');copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intDoDir(FILE*f,char*name){char*buf;DIR*dir;structdirent*dirent;if((dir=opendir(name))==0){fprintf(stderr,"Unabletoopendirectory%s,%d\n",name,errno);fflush(f);return-1;}PrintHeader(f,'h');alarm(TIMEOUT);fprintf(f,"<H1>Indexof%s</H1>\n\n",name);alarm(0);if(name[strlen(name)-1]!='/'){ strcat(name,"/");}while(dirent=readdir(dir)){ alarm(TIMEOUT);fprintf(f,"<p><ahref=\"/%s%s\">%s</a></p>\n",name,dirent->d_name,dirent->d_name); alarm(0);}closedir(dir);return0;}intDoHTML(FILE*f,char*name){char*buf;FILE*infile;intcount;char*dir=0;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"UnabletoopenHTMLfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'h');copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intDoText(FILE*f,char*name){char*buf;FILE*infile;intcount;if(!(infile=fopen(name,"r"))){alarm(TIMEOUT);fprintf(stderr,"Unabletoopentextfile%s,%d\n",name,errno);fflush(f);alarm(0);return-1;}PrintHeader(f,'t');copy(infile,f);/*printsthepage*/alarm(TIMEOUT);fclose(infile);alarm(0);return0;}intParseReq(FILE*f,char*r){char*bp; structstatstbuf; char*arg; char*c; inte; intraw;#ifdefDEBUG printf("reqis'%s'\n",r);#endifwhile(*(++r)!='');/*skipnon-whitespace*/while(isspace(*r)) r++;while(*r=='/') r++; bp=r;while(*r&&(*(r)!='')&&(*(r)!='?')) r++;#ifdefDEBUG printf("bp='%s'%x,r='%s'\n",bp,*bp,r);#endif if(*r=='?') {char*e; *r=0; arg=r+1; if(e=strchr(arg,'')){*e='\0';} }else{arg=0; *r=0;} c=bp;/*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if(c[0]==0x20){ c[0]='.'; c[1]='\0'; }/*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if(c[0]=='\0')strcat(c,"."); if(c&&!stat(c,&stbuf)) { if(S_ISDIR(stbuf.st_mode)) {char*end=c+strlen(c); strcat(c,"/index.html"); if(!stat(c,&stbuf)) {DoHTML(f,c); } else {*end='\0'; DoDir(f,c); } } elseif(!strcmp(r-4,".gif")) DoGif(f,c);elseif(!strcmp(r-4,".jpg")||!strcmp(r-5,".jpeg")) DoJpeg(f,c);elseif(!strcmp(r-4,".htm")||!strcmp(r-5,".html"))DoHTML(f,c);elseDoText(f,c); } else{ PrintHeader(f,'h'); alarm(TIMEOUT); fprintf(f,"<html><head><title>404FileNotFound</title></head>\n"); fprintf(f,"<body>TherequestedURLwasnotfoundonthisserver</body></html>\n"); alarm(0);} return0;}voidsigalrm(intsigno){/*gotanalarm,exit&recycle*/ exit(0);}intHandleConnect(intfd){FILE*f;charbuf[160];charbuf1[160];f=fdopen(fd,"a+");if(!f){fprintf(stderr,"d:Unabletoopendinputfd,error%d\n",errno);alarm(TIMEOUT);close(fd);alarm(0);return0;}setbuf(f,0);alarm(TIMEOUT);if(!fgets(buf,150,f)){fprintf(stderr,"d:Errorreadingconnection,error%d\n",errno);fclose(f);alarm(0);return0;}#ifdefDEBUG printf("buf='%s'\n",buf);#endifalarm(0);referrer[0]='\0'; content_length=-1;alarm(TIMEOUT); //readotherlinetoparseRrferrerandcontent_lengthinfomation while(fgets(buf1,150,f)&&(strlen(buf1)>2)){ alarm(TIMEOUT); #ifdefDEBUG printf("Gotbuf1'%s'\n",buf1); #endif if(!strncasecmp(buf1,"Referer:",8)){ char*c=buf1+8; while(isspace(*c)) c++; strcpy(referrer,c); } elseif(!strncasecmp(buf1,"Referrer:",9)){ char*c=buf1+9; while(isspace(*c)) c++; strcpy(referrer,c); } elseif(!strncasecmp(buf1,"Content-length:",15)){ content_length=atoi(buf1+15); } } alarm(0);if(ferror(f)){ fprintf(stderr,":Errorcontinuingreadingconnection,error%d\n",errno); fclose(f); return0; } ParseReq(f,buf);alarm(TIMEOUT); fflush(f); fclose(f);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論