基于linux系統(tǒng)的嵌入式web服務(wù)器設(shè)計2_第1頁
基于linux系統(tǒng)的嵌入式web服務(wù)器設(shè)計2_第2頁
基于linux系統(tǒng)的嵌入式web服務(wù)器設(shè)計2_第3頁
基于linux系統(tǒng)的嵌入式web服務(wù)器設(shè)計2_第4頁
基于linux系統(tǒng)的嵌入式web服務(wù)器設(shè)計2_第5頁
已閱讀5頁,還剩39頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 嵌入式系統(tǒng)開發(fā)課程設(shè)計 PAGE * 實踐教學*蘭州理工大學計算機與通信學院2015年春季學期嵌入式系統(tǒng)開發(fā)課程設(shè)計題 目: 基于LINUX系統(tǒng)的嵌入式WEB服務(wù)器的設(shè)計 專業(yè)班級: 通信工程12級1班 姓 名: 王愛強 學 號: 12250110 指導教師: 張璽君 成 績: 嵌入式系統(tǒng)開發(fā)課程設(shè)計 目錄TOC o 1-3 h u HYPERLINK l _Toc18475 摘 要 PAGEREF _Toc18475 1 HYPERLINK l _Toc19753 前 言 PAGEREF _Toc19753 2 HYPERLINK l _Toc24889 一、基本原理 PAGEREF _T

2、oc24889 3 HYPERLINK l _Toc31581 1.1嵌入式WEB服務(wù)器概述 PAGEREF _Toc31581 3 HYPERLINK l _Toc11172 1.2 SOCKET編程概述 PAGEREF _Toc11172 4 HYPERLINK l _Toc22953 二、系統(tǒng)分析 PAGEREF _Toc22953 6 HYPERLINK l _Toc8764 2.1整體結(jié)構(gòu)圖 PAGEREF _Toc8764 6 HYPERLINK l _Toc25359 2.2連接處理模塊 PAGEREF _Toc25359 6 HYPERLINK l _Toc22950 三、詳細

3、設(shè)計 PAGEREF _Toc22950 7 HYPERLINK l _Toc28830 3.1主程序設(shè)計 PAGEREF _Toc28830 7 HYPERLINK l _Toc2476 3.2客戶連接處理模塊設(shè)計 PAGEREF _Toc2476 8 HYPERLINK l _Toc31248 3.3客戶請求解析處理模塊設(shè)計 PAGEREF _Toc31248 8 HYPERLINK l _Toc13806 3.4發(fā)送HTTP協(xié)議數(shù)據(jù)頭模塊設(shè)計 PAGEREF _Toc13806 9 HYPERLINK l _Toc23585 四、運行結(jié)果 PAGEREF _Toc23585 11 HYP

4、ERLINK l _Toc6479 參考文獻 PAGEREF _Toc6479 16 HYPERLINK l _Toc23264 總 結(jié) PAGEREF _Toc23264 18 HYPERLINK l _Toc20880 致 謝 PAGEREF _Toc20880 20 HYPERLINK l _Toc1864 附錄 PAGEREF _Toc1864 21 摘 要嵌入式Web服務(wù)器主要用于遠程監(jiān)測和控制,它不同于傳統(tǒng)的Web服務(wù)器,硬件處理器能力和儲存能力有限,因此操作系統(tǒng)等相關(guān)軟件需要進行裁剪以適應嵌入式環(huán)境,開源代碼的操作系統(tǒng)Linu型具有強大的網(wǎng)絡(luò)服務(wù)功能,支持多種網(wǎng)絡(luò)接口和網(wǎng)絡(luò)協(xié)議棧

5、,同時具有成本低性能穩(wěn)定,擴充能力強等特點,成為嵌入式操作系統(tǒng)的首選。關(guān)鍵詞: Linux ;Web服務(wù)器; 瀏覽器;交叉編譯 前 言 嵌入式系統(tǒng)已經(jīng)成熟并且得到了廣泛地使用。在傳統(tǒng)的測控系統(tǒng)中,為了實現(xiàn)多個測控點之間的信息交流,一般采用RS-485、CAN、SPI等總線將多個測控節(jié)點組織成一個網(wǎng)絡(luò),但是這樣的網(wǎng)絡(luò)專用性太強,有效地通信范圍太窄,而基于TCP/IP協(xié)議的Web技術(shù)得到了普及,更重要的是這些協(xié)議是可開發(fā)的、標準的、獨立于平臺的。把嵌入式系統(tǒng)和與Web技術(shù)結(jié)合在一起,將Web技術(shù)引入到測量和控制系統(tǒng)中,實現(xiàn)基于嵌入式Web服務(wù)器的遠程控制系統(tǒng),必將有良好地應用前景。嵌入式系統(tǒng)離不開

6、嵌入式操作系統(tǒng)。目前商用的操作系統(tǒng)往往價格昂貴,不適應廣泛應用。嵌入式Linux操作系統(tǒng)源碼可開發(fā)。移植性好,支持多種硬件平臺并且支持幾乎所有的常見網(wǎng)絡(luò)通信協(xié)議支持的文件系統(tǒng)也很豐富,是一個功能完整的嵌入式操作系統(tǒng)并且有大量的優(yōu)秀開發(fā)碼源的應用軟件和開發(fā)工具可以使用。因此,采用Linux作為平臺,使用Web技術(shù)進行遠程在線測控系統(tǒng)的設(shè)計。嵌入式系統(tǒng)開發(fā)課程設(shè)計 一、基本原理1.1嵌入式WEB服務(wù)器概述1) WEB服務(wù)器 通常是在遠程機器上,負責對瀏覽器頁面請求作出響應,返回HTML編碼或類似的數(shù)據(jù)流。通俗的講,Web服務(wù)器傳送(serves)頁面使瀏覽器可以瀏覽,然而應用程序服務(wù)器提供的是客戶

7、端應用程序可以調(diào)用(call)的方法(methods)。確切一點,你可以說:Web服務(wù)器專門處理HTTP請求(request),但是應用程序服務(wù)器是通過很多協(xié)議來為應用程序提供(serves)商業(yè)邏輯(business logic)。 隨著Internet技術(shù)的興起,在嵌入式設(shè)備的管理與交互中,基于Web方式的應用成為目前的主流,這種程序結(jié)構(gòu)也就是大家非常熟悉的B/S結(jié)構(gòu),即在嵌入式設(shè)備上運行一個支持腳本或CGI功能的Web服務(wù)器,能夠生成動態(tài)頁面,在用戶端只需要通過Web瀏覽器就可以對嵌入式設(shè)備進行管理和監(jiān)控,非常方便實用。2) WEB瀏覽器 WEB瀏覽器是個顯示網(wǎng)頁伺服器或檔案系統(tǒng)內(nèi)的HT

8、ML文件,并讓用戶與此些文件互動的一種軟件。個人電腦上常見的網(wǎng)頁瀏覽器包括微軟的Internet Explorer、Mozilla的Firefox、Opera和Safari。瀏覽器是最經(jīng)常使用到的客戶端程序。3)嵌入式WEB服務(wù)器架構(gòu)圖1 嵌入式WEB服務(wù)器架構(gòu)常見的嵌入式WEB服務(wù)器有l(wèi)ighttpd、shttpd、thttpd、boa、mathopd、minihttpd、appweb、goahead等上百種。1.2 SOCKET編程概述現(xiàn)在大多數(shù)的操作系統(tǒng)都提供了已編譯好了的網(wǎng)絡(luò)通訊程序。TCP/IP范圍內(nèi)最普通的例子就是 web客戶端(瀏覽器) 和web服務(wù)器,還有就是FTP和Telne

9、t的客戶端和服務(wù)器等。Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應用程序。SOCKET編程接口#include int socket(int domain, int type, int protocol);說明: socket()函數(shù)創(chuàng)建一個套接字參數(shù):domain:應用程序所在主機使用的通信協(xié)議族 type:建立的套接字的類型 Protocol:使用的特定協(xié)議#include int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);說明

10、:將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來參數(shù):sockfd :調(diào)用socket返回的文件描述符 my_addr :指向數(shù)據(jù)結(jié)構(gòu) struct sockaddr 的指針,它保存地址(即端 口和IP地址)信息 addrlen :設(shè)置為 sizeof(struct sockaddr)#include int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);說明:建立套接字連接 ,成功返回0 ,失敗返回-1參數(shù):sockfd :調(diào)用socket返回的文件描述符 serv_addr:保存著目的地端口和 IP

11、 地址的數(shù)據(jù)結(jié)構(gòu) struct sockaddr addrlen:設(shè)置為 sizeof(struct sockaddr) #include int listen(int s, int backlog);說明:用于面向連接服務(wù)器,表明它愿意接收連接參數(shù):sockfd :調(diào)用socket返回的文件描述符 backlog:在進入隊列中允許的連接數(shù)目,在發(fā)生錯誤的時候返回-1 #include int accept(int s, struct sockaddr *addr, socklen_t *addrlen);說明:建立套接字連接,成功返回文件描述符,失敗-1 參數(shù):sockfd :調(diào)用socke

12、t返回的文件描述符 addr :指向局部的數(shù)據(jù)結(jié)構(gòu)sockaddr_in的指針 addrlen:設(shè)置為sizeof(struct sockaddr_in) #include #include ssize_t send(int s, const void *buf, size_t len, int flags);說明:用于流式套接字或者數(shù)據(jù)報套接字的通訊,返回實際發(fā)送的數(shù)據(jù)的字節(jié)數(shù),它在 錯誤的時候返回-1 參數(shù):sockfd:發(fā)送數(shù)據(jù)的套接字描述符(或者是調(diào)用socket()或者accept() msg:指向發(fā)送數(shù)據(jù)的指針 len:數(shù)據(jù)長度 flags:總是設(shè)置為0#include #incl

13、ude ssize_t recv(int s, void *buf, size_t len, int flags); 說明:用于流式套接字的通訊,recv()返回實際讀入緩沖的數(shù)據(jù)的字節(jié)數(shù)?;蛘咴阱e誤的時候返回-1 參數(shù):sockfd:要讀的SOCKET描述符 buf:要讀的信息的緩沖區(qū) len:緩沖的最大長度 flags:總是設(shè)置為0二、系統(tǒng)分析2.1整體結(jié)構(gòu)圖主程序:建立TCP類型SOCKET在80端口進行監(jiān)聽連接請求。接收到連接請求,將請求傳送給連接處理模塊處理。并繼續(xù)進行監(jiān)聽。如圖2所示: 圖2 整體流程2.2連接處理模塊圖3 連接處理模塊三、詳細設(shè)計3.1主程序設(shè)計1)功能說明系統(tǒng)的

14、總?cè)肟?,也是系統(tǒng)的主要控制函數(shù)。分別完成如下功能:建立環(huán)境設(shè)置。設(shè)置信號處理方式。建立偵聽TCP流方式SOCKET并綁定80端口。建立連接偵聽及客戶連接處理調(diào)用主循環(huán)。2)算法流程圖算法流程圖如圖4所示:圖4 算法流程圖3)命令行輸入處理用戶在命令行輸入?yún)?shù) -i ,則將客戶輸入文件描述字設(shè)為0,即標準輸入。用于在本機進行測試。其他輸入全部忽略。3.2客戶連接處理模塊設(shè)計1)功能說明 用于初步處理客戶的連接請求,并將請求信息傳遞給客戶請求解析函數(shù)處理。2)算法具體算法如圖5所示:圖5 算法流程圖3.3客戶請求解析處理模塊設(shè)計1)功能說明用于解析客戶的請求,并根據(jù)請求信息調(diào)用相應的函數(shù)進行請求處

15、理。2)算法算法流程圖如圖6所示:圖6 算法流程圖3.4發(fā)送HTTP協(xié)議數(shù)據(jù)頭模塊設(shè)計1)功能說明根據(jù)參數(shù)的不同,發(fā)送不同的HTTP協(xié)議頭信息。2)算法 函數(shù)定義為:int PrintHeader(FILE *f, int content_type)發(fā)送請求成功信息:HTTP/1.0 200 OK。根據(jù)文檔類型發(fā)送相應的信息:fprintf(),函數(shù)中的第一個參數(shù)f 為客戶連接文件流句柄。 switch (content_type) case t: fprintf(f,Content-type: text/plainn); break; case g: fprintf(f,Content-ty

16、pe: image/gifn); break; case j: fprintf(f,Content-type: image/jpegn); break; case h: fprintf(f,Content-type: text/htmln); break; 發(fā)送服務(wù)器信息: fprintf(f,Server: AMRLinux-httpd 0.2.4n);發(fā)送文件過期為永不過期:fprintf(f,Expires: 0n);四、運行結(jié)果1、進入目錄:rootlocalhost /# cd /UP-CUP210-II/SRC/exp/basic/04_webserver/rootlocalhos

17、t 04_webserver# lsGoogle Makefile copy.c copy.o doc httpd httpd.c httpd.o index.htmlrootlocalhost 04_webserver# 2、清除中間代碼,重新編譯rootlocalhost 04_webserver# make cleanrm -f ./bin/httpd ./httpd *.elf *.gdb *.orootlocalhost 04_webserver# makearm-linux-gcc -DHTTPD_DOCUMENT_ROOT=/mnt/yaffs -c -o httpd.o htt

18、pd.carm-linux-gcc -DHTTPD_DOCUMENT_ROOT=/mnt/yaffs -c -o copy.o copy.carm-linux-gcc -static -o ./bin/httpd httpd.o copy.o -lpthreadarm-linux-gcc -static -o httpd httpd.o copy.o -lpthreadrootlocalhost 04_webserver# lsGoogle Makefile copy.c copy.o doc httpd httpd.c httpd.o index.html當前目錄下生成可執(zhí)行程序httpd

19、。4、啟動UP-CUP210-II型實驗系統(tǒng),連好網(wǎng)線、串口線。通過串口終端掛載宿主機實驗目錄。rootUP-TECH yaffs# mountnfs 57:/UP-CUP210-II /mnt/nfs/6、進入串口終端的NFS共享實驗目錄。rootUP-TECH yaffs# cd /mnt/nfs/SRC/exp/basic/04_webserver/rootUP-TECH 04_webserver# lsGoogle copy.c doc httpd.c index.htmlMakefile copy.o httpd httpd.orootUP-TECH 04_webserver# 6、

20、執(zhí)行程序,啟動HTTP服務(wù)器。rootUP-TECH 04_webserver# ./httpdstarting httpd.press q to quit.wait for connection.此時UP-CUP210-II型設(shè)備端HTTP服務(wù)器啟動并等待連接。 打開PC機Windows XP系統(tǒng)上的IE瀏覽器,在地址欄輸入UP-CUP210-II型設(shè)備IP地址: 99 。如圖7所示: 圖7 輸入IP地址輸入正確的IP地址即可訪問UP-CUP210-II型設(shè)備上HTTP提供的服務(wù)。結(jié)果如下:ARM端:rootUP-TECH 04_webserver# ./httpdstarting http

21、d.press q to quit.wait for connection.buf = GET / HTTP/1.1Got buf1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint,Got buf1 application/msword, */*Got buf1 Accept-Language: zh-cnGot buf1 Accept-Encodi

22、ng: gzip, deflateGot buf1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQPinyinSetup 620; CIBA; MAXTHON 2.0)Got buf1 Host: 99Got buf1 Connection: Keep-Alive瀏覽器端:如圖8所示:圖8 瀏覽器端顯示參考文獻1 孫天澤,袁文菊,張海峰.嵌入式設(shè)計及Linux驅(qū)動開發(fā)指南基于ARM9 處理器M.北京:電子工業(yè)出版社,20052 于明,范書瑞,曾祥燁.ARM9嵌入式系統(tǒng)設(shè)計與開發(fā)教程M.北京:電子工業(yè)出

23、版社,20063 王田苗.嵌入式系統(tǒng)設(shè)計與實例開發(fā)M.北京:清華大學出版社,20034 Samsung Electronics.S3C2410X 32-Bit RISC Microprocessor Users Manual,20035 周立功等. ARM嵌入式Linux系統(tǒng)構(gòu)建與驅(qū)動開發(fā)范例.北京:北京航空航天大學出版社,20066 鄭慕德. 編著 嵌入式微型計算機系統(tǒng)實例教程-ARM 與 LINUX. 科學出版社2006.77 王進德. 編著 嵌入式 LINUX 程序設(shè)計與應用案例. 中國電力出版社, 2007.58 王學龍著. 嵌入式LINUX系統(tǒng)設(shè)計與應用M .北京:清華大學出版社,2

24、0019 林宇,郭凌云.LINUX網(wǎng)絡(luò)編程M.北京:人民郵電出版社,200010 張斌,高波等.LINUX網(wǎng)絡(luò)編程M.北京:清華大學出版社,2000總 結(jié) 兩周的課設(shè)在不知不覺中已經(jīng)結(jié)束了,雖說時間不長,但是收獲頗豐,不僅學到了一些新知識,鞏固了以前學習的內(nèi)容,增強了我的動手操作調(diào)試能力。雖說一些技術(shù)我們在課堂上野曾經(jīng)學習過,但是大都停留在理論學習上,實際開發(fā)很少,而這次課程設(shè)計給了我們一個很好的邊學習邊實踐的機會,對我們深入學習這些技術(shù)有很大的幫助,深刻體會到了這些技術(shù)的實用性。本次課程設(shè)計利用實驗室提供的博創(chuàng)經(jīng)典UP-CUP210-II型嵌入式實驗平臺,通過上位機編程控制下位機進行web服

25、務(wù)器的設(shè)計,使用C語言編程,生成目標文件,并且通過對宿主機下位機的相關(guān)上機操作,實現(xiàn)對書本內(nèi)容的實際操作,鞏固加深對嵌入式系統(tǒng)的認知和了解,最終在此基礎(chǔ)上進行創(chuàng)新設(shè)計,了解了一個實際的網(wǎng)絡(luò)通訊應用程序整體設(shè)計后,我們共同編寫C程序?qū)崿F(xiàn)對服務(wù)器的訪問。 經(jīng)過這段時間的學習、系統(tǒng)分析、方案論證、 硬件和軟件設(shè)計、 調(diào)試等的努力,完成了嵌入式web服務(wù)器的設(shè)計制作。在系統(tǒng)的設(shè)計制作過程中,確實遇到了各種各樣的問題,如調(diào)試思路正確但是沒有能夠進行找到合適的方法進行進一步的實驗,設(shè)計中對于程序的編寫以及目錄結(jié)構(gòu)的認知上存在偏差,其主要原因還是基礎(chǔ)功不扎實,把握系統(tǒng)的能力不足,這為我們以后的學習和工作提了

26、一個醒。在問題的解決過程中,也提高了我的動手動腦能力,學到了許多在書本上學不到的知識。在具體的設(shè)計當中解決了諸如 httpd服務(wù)器的搭建和C 程序的修改,程序的調(diào)試和系統(tǒng)的整體認識等問題,收獲很大。 做課程設(shè)計是一次再系統(tǒng)的學習,課程設(shè)計的完成,讓我在其中學到了許多,尤其是學會了合作,懂得了合作早就的效益和成果。在這里再次感謝和我一起搭檔的同學,還有對我們精心指導的老師!PAGE 40 致 謝 通過近兩周的努力,我們的課程設(shè)計終于完成了,這意味著這一階段艱苦的熱烈的付出即將告一段落。在整個課程設(shè)計中,我在學習上和思想上都受益匪淺,這除了自身的努力外,與指導的老師、同學的關(guān)心、支持和鼓勵是分不開

27、的。 做課程設(shè)計是一次再系統(tǒng)的學習,課程設(shè)計的完成,讓我在其中學到了許多,尤其是學會了合作,懂得了合作早就的效益和成果。在這里再次感謝和我一起搭檔的同學,還有對我們精心指導的老師!附錄Httpd.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include pthread.h#define DEBUGint KEY_QUIT=0;int TIMEOUT=30;#ifndef O_BINARY#define

28、 O_BINARY 0#endifchar referrer128;int content_length;#define SERVER_PORT 80int PrintHeader(FILE *f, int content_type) alarm(TIMEOUT); fprintf(f,HTTP/1.0 200 OKn); switch (content_type) case t: fprintf(f,Content-type: text/plainn); break; case g: fprintf(f,Content-type: image/gifn); break; case j: fp

29、rintf(f,Content-type: image/jpegn); break; case h: fprintf(f,Content-type: text/htmln); break; fprintf(f,Server: uClinux-httpd 0.2.2n); fprintf(f,Expires: 0n); fprintf(f,n); alarm(0); return(0);int DoJpeg(FILE *f, char *name) char *buf; FILE * infile; int count;if (!(infile = fopen(name, r) alarm(TI

30、MEOUT); fprintf(stderr, Unable to open JPEG file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,j); copy(infile,f); /* prints the page */ alarm(TIMEOUT); fclose(infile); alarm(0); return 0;int DoGif(FILE *f, char *name) char *buf; FILE * infile; int count; if (!(infile = fopen(

31、name, r) alarm(TIMEOUT); fprintf(stderr, Unable to open GIF file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,g);copy(infile,f); /* prints the page */ alarm(TIMEOUT);fclose(infile); alarm(0); return 0;int DoDir(FILE *f, char *name) char *buf; DIR * dir; struct dirent * dirent

32、;if (dir = opendir(name)= 0) fprintf(stderr, Unable to open directory %s, %dn, name, errno); fflush(f); return -1; PrintHeader(f,h); alarm(TIMEOUT); fprintf(f, Index of %snn,name); alarm(0);if (namestrlen(name)-1 != /) strcat(name, /); while(dirent = readdir(dir) alarm(TIMEOUT); fprintf(f, %sn, name

33、, dirent-d_name, dirent-d_name);alarm(0); closedir(dir); return 0;int DoHTML(FILE *f, char *name) char *buf; FILE *infile; int count; char * dir = 0;if (!(infile = fopen(name,r) alarm(TIMEOUT); fprintf(stderr, Unable to open HTML file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeade

34、r(f,h);copy(infile,f); /* prints the page */ alarm(TIMEOUT);fclose(infile);alarm(0);return 0;int DoText(FILE *f, char *name) char *buf; FILE *infile; int count;if (!(infile = fopen(name,r) alarm(TIMEOUT); fprintf(stderr, Unable to open text file %s, %dn, name, errno); fflush(f); alarm(0); return -1;

35、 PrintHeader(f,t);copy(infile,f); /* prints the page */ alarm(TIMEOUT);fclose(infile);alarm(0);return 0;int ParseReq(FILE *f, char *r) char *bp; struct stat stbuf; char * arg; char * c; int e; int raw;#ifdef DEBUG printf(req is %sn, r);#endif while(*(+r) != ); /*skip non-white space*/ while(isspace(

36、*r) r+;while (*r = /) r+; bp = r; while(*r & (*(r) != ) & (*(r) != ?) r+;#ifdef DEBUG 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 (c0 = 0 x20)c0=.

37、;c1=0; /*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if(c0 = 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); else if (!strcmp(r - 4, .gif) DoGif(f,c); else if (!s

38、trcmp(r - 4, .jpg) | !strcmp(r - 5, .jpeg) DoJpeg(f,c); else if (!strcmp(r - 4, .htm) | !strcmp(r - 5, .html) DoHTML(f,c); else DoText(f,c); else PrintHeader(f,h); alarm(TIMEOUT); fprintf(f, 404 File Not Foundn);fprintf(f, The requested URL was not found on this servern); alarm(0); return 0;void sig

39、alrm(int signo)/* got an alarm, exit & recycle */exit(0);int HandleConnect(int fd) FILE *f;char buf160; char buf1160;f = fdopen(fd,a+); if (!f) fprintf(stderr, httpd: Unable to open httpd input fd, error %dn, errno); alarm(TIMEOUT); close(fd); alarm(0); return 0; setbuf(f, 0);alarm(TIMEOUT); if (!fg

40、ets(buf, 150, f) fprintf(stderr, httpd: Error reading connection, error %dn, errno); fclose(f); alarm(0); return 0; #ifdef DEBUG printf(buf = %sn, buf);#endif alarm(0);referrer0 = 0; content_length = -1; alarm(TIMEOUT);/read other line to parse Rrferrer and content_length infomationwhile (fgets(buf1

41、, 150, f) & (strlen(buf1) 2) alarm(TIMEOUT);#ifdef DEBUG printf(Got buf1 %sn, buf1);#endif if (!strncasecmp(buf1, Referer:, 8) char * c = buf1+8; while (isspace(*c)c+; strcpy(referrer, c); else if (!strncasecmp(buf1, Referrer:, 9) char * c = buf1+9; while (isspace(*c)c+; strcpy(referrer, c); else if (!strncasecmp(buf1, Content-length:, 15) content_length = atoi(buf1+15); alarm(0); if (ferror(f) fprintf(stderr, http: Error continuing reading connection, error %dn, errno); fclose(f); return 0; ParseReq(f, buf);alarm(TIMEOUT); fflush(f); fclose(f); alarm

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論