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

下載本文檔

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

文檔簡介

1、* 實(shí)踐教學(xué)實(shí)踐教學(xué)*蘭州理工大學(xué)蘭州理工大學(xué)計(jì)算機(jī)與通信學(xué)院2015 年春季學(xué)期嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì)嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì)題 目: 基于 LINUX 系統(tǒng)的嵌入式 WEB 服務(wù)器的設(shè)計(jì) 專業(yè)班級: 通信工程 12 級 1 班 姓 名: 王愛強(qiáng) 學(xué) 號: 12250110 指導(dǎo)教師: 張璽君 成 績: 嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 目錄目錄摘 要.1前 言.2一、基本原理.31.1 嵌入式 WEB 服務(wù)器概述.31.2 SOCKET 編程概述.4二、系統(tǒng)分析.62.1 整體結(jié)構(gòu)圖.62.2 連接處理模塊.6三、詳細(xì)設(shè)計(jì).73.1 主程序設(shè)計(jì).73.2 客戶連接處理模塊設(shè)計(jì).83.3 客戶請求解析處

2、理模塊設(shè)計(jì).83.4 發(fā)送 HTTP 協(xié)議數(shù)據(jù)頭模塊設(shè)計(jì).9四、運(yùn)行結(jié)果.11參考文獻(xiàn).14總 結(jié).15致 謝.16附錄.17 嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 1摘摘 要要嵌入式 Web 服務(wù)器主要用于遠(yuǎn)程監(jiān)測和控制,它不同于傳統(tǒng)的 Web 服務(wù)器,硬件處理器能力和儲存能力有限,因此操作系統(tǒng)等相關(guān)軟件需要進(jìn)行裁剪以適應(yīng)嵌入式環(huán)境,開源代碼的操作系統(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)開發(fā)課程設(shè)計(jì) 2 前前 言言 嵌入式系統(tǒng)已經(jīng)成熟并且

3、得到了廣泛地使用。在傳統(tǒng)的測控系統(tǒng)中,為了實(shí)現(xiàn)多個(gè)測控點(diǎn)之間的信息交流,一般采用 RS-485、CAN、SPI 等總線將多個(gè)測控節(jié)點(diǎn)組織成一個(gè)網(wǎng)絡(luò),但是這樣的網(wǎng)絡(luò)專用性太強(qiáng),有效地通信范圍太窄,而基于 TCP/IP 協(xié)議的Web 技術(shù)得到了普及,更重要的是這些協(xié)議是可開發(fā)的、標(biāo)準(zhǔn)的、獨(dú)立于平臺的。把嵌入式系統(tǒng)和與 Web 技術(shù)結(jié)合在一起,將 Web 技術(shù)引入到測量和控制系統(tǒng)中,實(shí)現(xiàn)基于嵌入式 Web 服務(wù)器的遠(yuǎn)程控制系統(tǒng),必將有良好地應(yīng)用前景。嵌入式系統(tǒng)離不開嵌入式操作系統(tǒng)。目前商用的操作系統(tǒng)往往價(jià)格昂貴,不適應(yīng)廣泛應(yīng)用。嵌入式 Linux 操作系統(tǒng)源碼可開發(fā)。移植性好,支持多種硬件平臺并且支

4、持幾乎所有的常見網(wǎng)絡(luò)通信協(xié)議支持的文件系統(tǒng)也很豐富,是一個(gè)功能完整的嵌入式操作系統(tǒng)并且有大量的優(yōu)秀開發(fā)碼源的應(yīng)用軟件和開發(fā)工具可以使用。因此,采用Linux 作為平臺,使用 Web 技術(shù)進(jìn)行遠(yuǎn)程在線測控系統(tǒng)的設(shè)計(jì)。嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 3一、基本原理一、基本原理1.1 嵌入式 WEB 服務(wù)器概述1) WEB 服務(wù)器 通常是在遠(yuǎn)程機(jī)器上,負(fù)責(zé)對瀏覽器頁面請求作出響應(yīng),返回 HTML 編碼或類似的數(shù)據(jù)流。通俗的講,Web 服務(wù)器傳送(serves)頁面使瀏覽器可以瀏覽,然而應(yīng)用程序服務(wù)器提供的是客戶端應(yīng)用程序可以調(diào)用(call)的方法(methods)。確切一點(diǎn),你可以說:Web 服務(wù)器專門處理

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

6、網(wǎng)頁瀏覽器包括微軟的 Internet Explorer、Mozilla 的 Firefox、Opera 和 Safari。瀏覽器是最經(jīng)常使用到的客戶端程序。3)嵌入式 WEB 服務(wù)器架構(gòu)嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 4圖 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 和Te

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

8、 addrlen);說明:將套接字地址與所創(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 返回的文件描述符嵌入式系

9、統(tǒng)開發(fā)課程設(shè)計(jì) 5 serv_addr:保存著目的地端口和 IP 地址的數(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:在進(jìn)入隊(duì)列中允許的連接數(shù)目,在發(fā)生錯(cuò)誤的時(shí)候返回-1 #include int accept(int s, struct sockaddr *addr, socklen_t *addrlen);說明:建立套接字連接

10、,成功返回文件描述符,失敗-1 參數(shù):sockfd :調(diào)用 socket 返回的文件描述符 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ù)報(bào)套接字的通訊,返回實(shí)際發(fā)送的數(shù)據(jù)的字節(jié)數(shù),它在 錯(cuò)誤的時(shí)候返回-1 參數(shù):sockfd:發(fā)送數(shù)據(jù)的套接字描述符(或者是調(diào)用 socket()或者accept() msg:指向發(fā)送數(shù)

11、據(jù)的指針 len:數(shù)據(jù)長度 flags:總是設(shè)置為 0#include #include ssize_t recv(int s, void *buf, size_t len, int flags); 說明:用于流式套接字的通訊,recv()返回實(shí)際讀入緩沖 的數(shù)據(jù)的字節(jié)數(shù)?;蛘咴阱e(cuò)誤的時(shí)候返回-1 嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 6 參數(shù):sockfd:要讀的 SOCKET 描述符 buf:要讀的信息的緩沖區(qū) len:緩沖的最大長度 flags:總是設(shè)置為 0二、二、系統(tǒng)分析系統(tǒng)分析2.1 整體結(jié)構(gòu)圖主程序:建立 TCP 類型 SOCKET 在 80 端口進(jìn)行監(jiān)聽連接請求。接收到連接請求,將請求傳送給

12、連接處理模塊處理。并繼續(xù)進(jìn)行監(jiān)聽。如圖 2 所示:主程序MAIN1、環(huán)境設(shè)置2、建立偵聽SOCKET及客戶連接處理調(diào)用主循環(huán)客戶連接處理解析客戶請求HTTP協(xié)議頭發(fā)送HTTP協(xié)議數(shù)據(jù)頭發(fā)送GIF文件發(fā)送文本文件發(fā)送JPG文件發(fā)送HTML文件發(fā)送當(dāng)前目錄信息 圖 2 整體流程2.2 連接處理模塊客戶請求獲取服務(wù)器資源解析客戶請求字符串發(fā)送HTTP協(xié)議頭發(fā)送資源數(shù)據(jù)偵聽客戶請求客戶計(jì)算機(jī)讀取客戶請求資源嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 7圖 3 連接處理模塊三、詳細(xì)設(shè)計(jì)三、詳細(xì)設(shè)計(jì)3.1 主程序設(shè)計(jì)1)功能說明系統(tǒng)的總?cè)肟?,也是系統(tǒng)的主要控制函數(shù)。分別完成如下功能: 建立環(huán)境設(shè)置。 設(shè)置信號處理方式。 建立

13、偵聽 TCP 流方式 SOCKET 并綁定 80 端口。 建立連接偵聽及客戶連接處理調(diào)用主循環(huán)。2)算法流程圖算法流程圖如圖 4 所示:設(shè)置信號處理句柄進(jìn)入根目錄命令行處理建立TCP流SOCKET綁定監(jiān)聽端口設(shè)置允許客戶連接數(shù)量偵聽客戶連接請求客戶連接請求處理圖 4 算法流程圖3)命令行輸入處理嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 8用戶在命令行輸入?yún)?shù) -i ,則將客戶輸入文件描述字設(shè)為 0,即標(biāo)準(zhǔn)輸入。用于在本機(jī)進(jìn)行測試。其他輸入全部忽略。3.2 客戶連接處理模塊設(shè)計(jì)1)功能說明 用于初步處理客戶的連接請求,并將請求信息傳遞給客戶請求解析函數(shù)處理。2)算法具體算法如圖 5 所示:打開文件描述字,并建立文

14、件描述符讀取連接信息獲取Refferer字段信息賦值給Refferer全局變量獲取content_length字段信息調(diào)用客戶請求解析模塊關(guān)閉文件流圖 5 算法流程圖3.3 客戶請求解析處理模塊設(shè)計(jì)1)功能說明用于解析客戶的請求,并根據(jù)請求信息調(diào)用相應(yīng)的函數(shù)進(jìn)行請求處理。2)算法嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 9算法流程圖如圖 6 所示:對客戶的請求字符串進(jìn)行空格處理發(fā)送當(dāng)前目錄的INDEX.HTML文件請求目錄下的index.html是否存在?發(fā)送當(dāng)前目錄信息是否請求目錄? 是 是JPG或JPEG文件判斷客戶請求文件類型 否 是GIF圖像文件是HTML文件是純文本文件發(fā)送協(xié)議頭:Content-ty

15、pe: image/jpeg請求資源是否存在? 是 回應(yīng)請求資源不存在。 否 發(fā)送協(xié)議頭:Content-type: image/gif發(fā)送協(xié)議頭:Content-type: text/html發(fā)送協(xié)議頭:Content-type: text/plain發(fā)送文件數(shù)據(jù) 是 否 圖 6 算法流程圖3.4 發(fā)送 HTTP 協(xié)議數(shù)據(jù)頭模塊設(shè)計(jì)1)功能說明根據(jù)參數(shù)的不同,發(fā)送不同的 HTTP 協(xié)議頭信息。2)算法 函數(shù)定義為:int PrintHeader(FILE *f, int content_type)嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 10發(fā)送請求成功信息:HTTP/1.0 200 OK。根據(jù)文檔類型發(fā)送相

16、應(yīng)的信息:fprintf(),函數(shù)中的第一個(gè)參數(shù) f 為客戶連接文件流句柄。 switch (content_type) case t: fprintf(f,Content-type: text/plainn); break; case g: fprintf(f,Content-type: 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: AM

17、RLinux-httpd 0.2.4n);發(fā)送文件過期為永不過期:fprintf(f,Expires: 0n);嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 11四、運(yùn)行結(jié)果四、運(yùn)行結(jié)果1、進(jìn)入目錄:rootlocalhost /# cd /UP-CUP210-II/SRC/exp/basic/04_webserver/rootlocalhost 04_webserver# lsGoogle Makefile copy.c copy.o doc httpd httpd.c httpd.o index.htmlrootlocalhost 04_webserver# 2、清除中間代碼,重新編譯rootlocalhost

18、 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 httpd.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-lin

19、ux-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當(dāng)前目錄下生成可執(zhí)行程序 httpd 。4、啟動 UP-CUP210-II 型實(shí)驗(yàn)系統(tǒng),連好網(wǎng)線、串口線。通過串口終端掛載宿主機(jī)實(shí)驗(yàn)?zāi)夸?。rootUP-TECH yaffs# mountnfs 57:/UP-CUP210-II /mnt/nfs/6、進(jìn)入串口終端的 NFS 共享實(shí)驗(yàn)?zāi)夸洝?/p>

20、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.o嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 12rootUP-TECH 04_webserver# 6、執(zhí)行程序,啟動 HTTP 服務(wù)器。rootUP-TECH 04_webserver# ./httpdstarting httpd.press q to quit.wait for connection.此時(shí) UP-

21、CUP210-II 型設(shè)備端 HTTP 服務(wù)器啟動并等待連接。 打開 PC 機(jī) 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 httpd.press q to quit.wait for connection.buf = GET / HTTP/1.1Got

22、 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-Encoding: gzip, deflateGot buf1 User-Agent: Mozilla/4.0 (compatible

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

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

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

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

27、的能力不足,這為我們以后的學(xué)習(xí)和工作提了一個(gè)醒。在問題的解決過程中,也提高了我的動手動腦能力,學(xué)到了許多在書本上學(xué)不到的知識。在具體的設(shè)計(jì)當(dāng)中解決了諸如 httpd 服務(wù)器的搭建和 C 程序的修改,程序的調(diào)試和系統(tǒng)的整體認(rèn)識等問題,收獲很大。 做課程設(shè)計(jì)是一次再系統(tǒng)的學(xué)習(xí),課程設(shè)計(jì)的完成,讓我在其中學(xué)到了許多,尤其是學(xué)會了合作,懂得了合作早就的效益和成果。在這里再次感謝和我一起搭檔的同學(xué),還有對我們精心指導(dǎo)的老師!嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 16嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 17 致致 謝謝 通過近兩周的努力,我們的課程設(shè)計(jì)終于完成了,這意味著這一階段艱苦的熱烈的付出即將告一段落。在整個(gè)課程設(shè)計(jì)中,我在

28、學(xué)習(xí)上和思想上都受益匪淺,這除了自身的努力外,與指導(dǎo)的老師、同學(xué)的關(guān)心、支持和鼓勵(lì)是分不開的。 做課程設(shè)計(jì)是一次再系統(tǒng)的學(xué)習(xí),課程設(shè)計(jì)的完成,讓我在其中學(xué)到了許多,尤其是學(xué)會了合作,懂得了合作早就的效益和成果。在這里再次感謝和我一起搭檔的同學(xué),還有對我們精心指導(dǎo)的老師!嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 18附錄附錄Httpd.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include pthread.h#defi

29、ne DEBUGint KEY_QUIT=0;int TIMEOUT=30;#ifndef O_BINARY#define 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; c

30、ase g: fprintf(f,Content-type: image/gifn); break; case j: fprintf(f,Content-type: image/jpegn); break; case h: fprintf(f,Content-type: text/htmln); break; 嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 19 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

31、) char *buf; FILE * infile; int count;if (!(infile = fopen(name, r) alarm(TIMEOUT); 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(FIL

32、E *f, char *name) char *buf; FILE * infile; int count; if (!(infile = fopen(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

33、;嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 20int DoDir(FILE *f, char *name) char *buf; DIR * dir; struct dirent * dirent;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)

34、-1 != /) strcat(name, /); while(dirent = readdir(dir) alarm(TIMEOUT); fprintf(f, %sn, name, 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,

35、Unable to open HTML file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,h);copy(infile,f); /* prints the page */ alarm(TIMEOUT);fclose(infile);alarm(0);return 0;嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 21int DoText(FILE *f, char *name) char *buf; FILE *infile; int count;if (!(infile = fopen(name,r) alarm(T

36、IMEOUT); fprintf(stderr, Unable to open text file %s, %dn, name, errno); fflush(f); alarm(0); return -1; 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

37、 raw;#ifdef DEBUG printf(req is %sn, r);#endif while(*(+r) != ); /*skip non-white space*/ while(isspace(*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;嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 22 if (

38、e = strchr(arg, ) *e = 0; else arg = 0; *r = 0; c = bp;/*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if (c0 = 0 x20)c0=.;c1=0; /*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if(c0 = 0) strcat(c,.);if (c & !stat(c, &stbuf) if (S_ISDIR(stbuf.st_mode) char * end = c + strlen(c); strc

39、at(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 (!strcmp(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)

40、; alarm(TIMEOUT); fprintf(f, 404 File Not Foundn);fprintf(f, The requested URL was not found on this servern); alarm(0); return 0;嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 23void sigalrm(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)

41、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 (!fgets(buf, 150, f) fprintf(stderr, httpd: Error reading connection, error %dn, errno); fclose(f); alarm(0); return 0; #ifdef DEBUG printf(buf = %s

42、n, buf);#endif alarm(0);referrer0 = 0; content_length = -1; alarm(TIMEOUT);/read other line to parse Rrferrer and content_length infomationwhile (fgets(buf1, 150, f) & (strlen(buf1) 2) alarm(TIMEOUT);#ifdef DEBUG printf(Got buf1 %sn, buf1);#endif if (!strncasecmp(buf1, Referer:, 8) char * c = bu

43、f1+8; while (isspace(*c)c+; strcpy(referrer, c); 嵌入式系統(tǒng)開發(fā)課程設(shè)計(jì) 24 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(

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論