嵌入式Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)_第1頁
嵌入式Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)_第2頁
嵌入式Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)_第3頁
嵌入式Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)_第4頁
嵌入式Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、嵌入式Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)摘要:基于ARM10平臺(tái)的嵌入式Linux,研究了嵌入式Web服務(wù)器的設(shè)計(jì),并成功實(shí)現(xiàn)了對(duì)嵌入式Web服務(wù)器的遠(yuǎn)程訪問。關(guān)鍵詞:嵌入式Linux;ARM;Web服務(wù)器;線程0引言嵌入式系統(tǒng)是21世紀(jì)具有廣闊發(fā)展前景的技術(shù)方向之一,自20世紀(jì)70年代初出現(xiàn)嵌入式系統(tǒng)的概念以來,嵌入式系統(tǒng)以其高性能、低功耗等特點(diǎn)獲得了高速的發(fā)展。在20世紀(jì)末、21世紀(jì)初,嵌入式技術(shù)又與網(wǎng)絡(luò)技術(shù)廣泛結(jié)合,拓展出許多新的應(yīng)用領(lǐng)域。本文講述了基于ARM10平臺(tái)的嵌入式Web服務(wù)器的設(shè)計(jì)及其實(shí)現(xiàn)。硬件的主要組成:PXA270RP實(shí)驗(yàn)平臺(tái)。本系統(tǒng)開發(fā)板中的操作系統(tǒng)采用嵌入式Linux,其具有優(yōu)異

2、、可移植性強(qiáng)、穩(wěn)定性高的網(wǎng)絡(luò)功能,采用版本的內(nèi)核。HTTP協(xié)議HTTP/1.0和HTTP/1.1都把TCP作為底層的傳輸協(xié)議。HTTP客戶首先發(fā)起建立與服務(wù)器TCP的連接。一旦建立連接,瀏覽器進(jìn)程和服務(wù)器進(jìn)程就可以對(duì)Socket進(jìn)行通信,客戶往自己的Socket發(fā)送HTTP請(qǐng)求消息,從自己的Socket接收HTTP響應(yīng)消息;類似地,服務(wù)器從自己的Socket接收HTTP請(qǐng)求消息,往自己的Socket發(fā)送HTTP響應(yīng)消息。HTTP規(guī)范1.0RPcl945和1.1RFC2616定義了HTTP消息的格式。HTTP消息分為請(qǐng)求消息和響應(yīng)消息兩類,格式如下:HTTP請(qǐng)求消息GET/index.htmlH

3、TTP/1.1Host:closeUseragent:Mozilla/5.0Acceptlanguage:zhcn(額外的回車符和換行符)HTTP響應(yīng)消息HTTP/1.1200OKDate:Tue,25Dec201200:45:45GMTServer:BWS/1.0Connection:closeContentLength:9888ContentType:text/html;charset=gbk(數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù))實(shí)現(xiàn)流程嵌入式Web服務(wù)器的實(shí)現(xiàn)流程如圖1所示。一個(gè)簡(jiǎn)單的嵌入式Web服務(wù)器的功能是接收Client發(fā)送的請(qǐng)求并響應(yīng),并根據(jù)Client的請(qǐng)求向Client傳送所需內(nèi)容。獲取S

4、erver當(dāng)前目錄文件列表:將Server當(dāng)前目錄下所有文件的信息發(fā)送給Client,信息包括:文件名、日期、大小;獲取指定文件:將Client請(qǐng)求的文件發(fā)送給Client;獲取HTML類型文件:將Client請(qǐng)求的HTML類型文件發(fā)送給Client;獲取純文本文件:將Client請(qǐng)求的純文本發(fā)送給Client;獲取JPG圖像文件:將Client請(qǐng)求的JPG圖像文件發(fā)送給Client;獲取GIF圖像文件:將Client請(qǐng)求的GIF圖像文件發(fā)送給Client;解析Client請(qǐng)求:分析Client的請(qǐng)求,將請(qǐng)求信息解析為幾個(gè)變量,如:請(qǐng)求的命令、文件名、文件類型。主要代碼intPrintHead

5、er(FILE*f,intcontent_type)/發(fā)送HTTP協(xié)議數(shù)據(jù)頭fprintf(f,HTTP/1.0200OKn);服務(wù)器回應(yīng)http協(xié)議數(shù)據(jù)頭的狀態(tài)行;發(fā)送請(qǐng)求成功;switch(content_type)8caset:fprintf(f,Content-type:text/plainn);break;/發(fā)送純文本文件信息;11caseg:fprintf(f,Content-type:image/gifn);break;/發(fā)送gif格式圖片信息;14casej:fprintf(f,Content-type:image/jpegn);break;發(fā)送gpeg格式圖片信息;17cas

6、eh:fprintf(f,Content-type:text/htmln);break;/發(fā)送html信息;fprintf(f,Server:embedded-httpd0.1n);/發(fā)送服務(wù)器版本信息;fprintf(f,Expires:0n);/發(fā)送文件永不過期信息;fprintf(f,n);return(0);26intDoJpeg(FILE*f,char*name)/對(duì)jpeg格式的文件進(jìn)行處理;char*buf;FILE*infile;intcount;34if(!(infile=fopen(name,r)/通過文件名打開一個(gè)文件,只讀屬性;36fprintf(stderr,Unab

7、letoopenJPEGfile%s,%dn,name,errno);37fflush(f);return-1;4042PrintHeader(f,j);/發(fā)送j類型的http協(xié)議數(shù)據(jù)頭信息;45copy(infile,f);/*printsthepage*/48fclose(infile);return0;5254intDoGif()、DoDir()、DoHTML()、DoText()類似DoJpeg()intParseReq(FILE*f,char*r)char*bp;structstatstbuf;char*arg;char*c;inte;intraw;174while(*(+r)!=)

8、;/*skipnon-whitespace*/判斷buf中的內(nèi)容是否為空跳過非空白;175while(isspace(*r)r+;/判斷r所在位置的字符是否為空格,若為空格則r指向下一個(gè)字符;178while(*r=/)r+;/判斷r所在位置的字符是否為/若為空格則r指向下一個(gè)字符;180bp=r;/將r所指向的內(nèi)容賦值給bpbp指向/之后的內(nèi)容;img/baidu_sylogo1.gifHTTP/1.1rn182while(*r&(*(r)!=)&(*(r)!=?)r+;/當(dāng)r不為空,并求r不為?時(shí)r指向下一個(gè)字符189if(*r=?)/判斷r是否為?若為?則執(zhí)行以下語句;191char*e

9、;*r=0;arg=r+1;194if(e=strchr(arg,)*e=O;/如果arg為空則將arg所在位置置為0復(fù)制給e;198else/如果當(dāng)前r指向字符不為?,將r指向字符置為O,2OOarg=O;*r=O;2O22O4c=bp;207if(c0=0 x20)c0=.;c1=O;/判斷c中的字符內(nèi)容是否為空格;若為空格212if(c0=0)strca(tc,.);/若c中為0則將.鏈接在c后214if(c&!stat(c,&stbuf)/通過文件名c獲取文件信息,并保存在stbuf中if(S_ISDIR(stbuf.st_mode)/判斷結(jié)果是否為特定的值char*end=c+str

10、len(c);/end指向c的末尾;strcat(c,/index.html);將/index.html加到c后,后面追加0;if(!stat(c,&stbuf)/通過文件名c獲取文件信息,并保存在stbuf中;成功返回0DoHTML(f,c);/對(duì)html文件進(jìn)行處理;225else*end=0;DoDir(f,c);/若c中沒有/index.html則跳到目錄處理代碼處執(zhí)行231elseif(!strcmp(r-4,.gif)/判斷r中的后四個(gè)字符,即判斷文件類型;DoGif(f,c);/若是gif格式的文件則跳轉(zhuǎn)到DoGif對(duì)其進(jìn)行處理;elseif(!strcmp(r-4,.jpg)|

11、!strcmp(r-5,.jpeg)DoJpeg(f,c);/若是jpg或jpeg格式的文件則跳轉(zhuǎn)到DoJpeg對(duì)其進(jìn)行處理elseif(!strcmp(r-4,.htm)|!strcmp(r-5,.html)DoHTML(f,c);若是htm格式的文件則跳轉(zhuǎn)到DoHTML處對(duì)其進(jìn)行處理elseDoTex(f,c);/若是純文本格式的文件則跳轉(zhuǎn)到DoText對(duì)其進(jìn)行處理240else242PrintHeader(f,h);/發(fā)送h類型的http協(xié)議數(shù)據(jù)頭fprintf(f,n);/打印出錯(cuò)信息fprintf(f,TherequestedURLwasnotfoundonthisservern);

12、247return0;249intHandleConnect(intfd)FILE*f;charbuf160;charbuf1160;264f=fdopen(fd,a+);/以文件描述符的形式打開文件;a+以附加方式打開可讀寫的文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫入的數(shù)據(jù)會(huì)被加到文件尾后,即文件原先的內(nèi)容會(huì)被保留。272setbuf(f,0);/將關(guān)閉緩沖區(qū);if(!fgets(buf,150,f)/直接通過f讀取150個(gè)字符放入以buf為起始地址中,不成功時(shí)返回0則打印出錯(cuò)信息;否則fgets成功返回函數(shù)指針打印buf的內(nèi)容;fprintf(stderr,httpd:Erro

13、rreadingconnection,error%dn,errno);fclose(f);return0;281288referrer0=0;content_length=-1;293while(fgets(buf1,150,f)&(strlen(buf1)2)/直接通過f讀取150個(gè)字符放入以buf1為起始地址的空間中;if(!strncasecmp(buf1,Referer:,8)/將buf1中的前八個(gè)字符與字符串Referer:若相等則將將指針指向bufl中的Referer:之后;char*c=buf1+8;while(isspace(*c)c+;/判斷c處是否為空格若為空格則c指向下一

14、個(gè)字符;strcpy(referrer,c);/將c所指的內(nèi)存單元的內(nèi)容復(fù)制到referrer數(shù)組中;elseif(!strncasecmp(buf1,Referrer:,9)/將bufl中的前九個(gè)字符與字符串Referrer:若相等則將將指針指向bufl中的Referrer:之后;305char*c=buf1+8;char*c=buf1+9;307while(isspace(*c)c+;/判斷c處是否為空格若為空格則c指向下一個(gè)字符;309strcpy(referrer,c);/將c所指的內(nèi)存單元的內(nèi)容復(fù)制到referrer數(shù)組中;310elseif(!strncasecmp(buf1,Co

15、ntent-length:,15)將bufl中的前15個(gè)字符與字符串Content-length:若相等則將將指針指向bufl中的Content-length:之后;content_length=atoi(buf1+15);/atoi類型轉(zhuǎn)換將buf1中的內(nèi)容轉(zhuǎn)換為整型賦值給content_length;324ParseReq(f,buf);/解析客戶請(qǐng)求函數(shù);327fflush(f);fclose(f);return1;331335void*key(void*data)從鍵盤輸入一個(gè)字符,若輸入q則退出程序;intmain(intargc,char*argv)intfd,s;intlen;v

16、olatileinttrue=1;354structsockaddr_inec,server_sockadd;r/定義結(jié)構(gòu)體變量;357pthread_tth_key;void*retval;chroot(HTTPD_DOCUMENT_ROOT);/改變根目錄;在makefile文件中指定;printf(startinghttpd.n);/打印啟用服務(wù)器程序信息;printf(pressqtoquit.n);370if(argc1&!strcmp(argv1,-i)/若argv1等于-istrcmp返回0并且argc大于1執(zhí)行if下的語句快即關(guān)閉文件描述符;372fclose(stderr);

17、HandleConnect(0);/向HandleConnect函數(shù)傳入0文件描述符即標(biāo)準(zhǔn)輸入;exit(0);server_sockaddr.sin_family=AF_INET;server_sockaddr.sin_port=hton(sSERVER_PORT);=hto(nlINADDR_ANY);392if(bind(s,(structsockaddr*)&server_sockaddr,sizeof(server_sockaddr)=-1)395perror(Unabletobindsocket);exit(1);397399if(listen(s,8*3)=-1)perror(U

18、nabletolisten);exit(4);405pthread_creat(e&th_key,NULL,key,0);/創(chuàng)建線程;printf(waitforconnection.n);while(1)len=sizeof(ec);411if(fd=accept(s,(void*)&ec,&len)=-1)/接受客戶機(jī)的請(qǐng)求,與客戶機(jī)建立鏈接;412exit(5);close(s);415HandleConnec(tfd);/處理鏈接函數(shù)調(diào)用fd為客戶連接文件描述符;417418pthread_join(th_key,&retval);/以阻塞的方式等待thread指定的線程結(jié)束。當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回。如果進(jìn)程已經(jīng)結(jié)束,那么該函數(shù)會(huì)立即返回。成功返回0;該語句不會(huì)執(zhí)行到;420嵌入式Web服務(wù)器的程序算法流程如圖2所示。4測(cè)試打開Web瀏覽器,

溫馨提示

  • 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. 人人文庫(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)論