基于LINUX系統的嵌入式WEB服務器的設計 2_第1頁
基于LINUX系統的嵌入式WEB服務器的設計 2_第2頁
基于LINUX系統的嵌入式WEB服務器的設計 2_第3頁
基于LINUX系統的嵌入式WEB服務器的設計 2_第4頁
基于LINUX系統的嵌入式WEB服務器的設計 2_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、* 實踐教學實踐教學*蘭州理工大學蘭州理工大學計算機與通信學院2015 年春季學期嵌入式系統開發課程設計嵌入式系統開發課程設計題 目: 基于 LINUX 系統的嵌入式 WEB 服務器的設計 專業班級: 通信工程 12 級 1 班 姓 名: 王愛強 學 號: 12250110 指導教師: 張璽君 成 績: 嵌入式系統開發課程設計 目錄目錄摘 要.1前 言.2一、基本原理.31.1 嵌入式 WEB 服務器概述.31.2 SOCKET 編程概述.4二、系統分析.62.1 整體結構圖.62.2 連接處理模塊.6三、詳細設計.73.1 主程序設計.73.2 客戶連接處理模塊設計.83.3 客戶請求解析處

2、理模塊設計.83.4 發送 HTTP 協議數據頭模塊設計.9四、運行結果.11參考文獻.14總 結.15致 謝.16附錄.17 嵌入式系統開發課程設計 1摘摘 要要嵌入式 Web 服務器主要用于遠程監測和控制,它不同于傳統的 Web 服務器,硬件處理器能力和儲存能力有限,因此操作系統等相關軟件需要進行裁剪以適應嵌入式環境,開源代碼的操作系統 Linu 型具有強大的網絡服務功能,支持多種網絡接口和網絡協議棧,同時具有成本低性能穩定,擴充能力強等特點,成為嵌入式操作系統的首選。關鍵詞: Linux ;Web 服務器; 瀏覽器;交叉編譯 嵌入式系統開發課程設計 2 前前 言言 嵌入式系統已經成熟并且

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

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

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

6、網頁瀏覽器包括微軟的 Internet Explorer、Mozilla 的 Firefox、Opera 和 Safari。瀏覽器是最經常使用到的客戶端程序。3)嵌入式 WEB 服務器架構嵌入式系統開發課程設計 4圖 1 嵌入式 WEB 服務器架構常見的嵌入式 WEB 服務器有lighttpd、shttpd、thttpd、boa、mathopd、minihttpd、appweb、goahead 等上百種。1.2 SOCKET 編程概述現在大多數的操作系統都提供了已編譯好了的網絡通訊程序。TCP/IP 范圍內最普通的例子就是 web 客戶端(瀏覽器) 和 web 服務器,還有就是 FTP 和Te

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

8、 addrlen);說明:將套接字地址與所創建的套接字號聯系起來參數:sockfd :調用 socket 返回的文件描述符 my_addr :指向數據結構 struct sockaddr 的指針,它保存地址(即端 口和 IP 地址)信息 addrlen :設置為 sizeof(struct sockaddr)#include int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);說明:建立套接字連接 ,成功返回 0 ,失敗返回-1參數:sockfd :調用 socket 返回的文件描述符嵌入式系

9、統開發課程設計 5 serv_addr:保存著目的地端口和 IP 地址的數據結構 struct sockaddr addrlen:設置為 sizeof(struct sockaddr) #include int listen(int s, int backlog);說明:用于面向連接服務器,表明它愿意接收連接參數:sockfd :調用 socket 返回的文件描述符 backlog:在進入隊列中允許的連接數目,在發生錯誤的時候返回-1 #include int accept(int s, struct sockaddr *addr, socklen_t *addrlen);說明:建立套接字連接

10、,成功返回文件描述符,失敗-1 參數:sockfd :調用 socket 返回的文件描述符 addr :指向局部的數據結構 sockaddr_in 的指針 addrlen:設置為 sizeof(struct sockaddr_in) #include #include ssize_t send(int s, const void *buf, size_t len, int flags);說明:用于流式套接字或者數據報套接字的通訊,返回實際發送的數據的字節數,它在 錯誤的時候返回-1 參數:sockfd:發送數據的套接字描述符(或者是調用 socket()或者accept() msg:指向發送數

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

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

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

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

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

16、應的信息:fprintf(),函數中的第一個參數 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; 發送服務器信息: fprintf(f,Server: AM

17、RLinux-httpd 0.2.4n);發送文件過期為永不過期:fprintf(f,Expires: 0n);嵌入式系統開發課程設計 11四、運行結果四、運行結果1、進入目錄: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當前目錄下生成可執行程序 httpd 。4、啟動 UP-CUP210-II 型實驗系統,連好網線、串口線。通過串口終端掛載宿主機實驗目錄。rootUP-TECH yaffs# mountnfs 57:/UP-CUP210-II /mnt/nfs/6、進入串口終端的 NFS 共享實驗目錄。

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嵌入式系統開發課程設計 12rootUP-TECH 04_webserver# 6、執行程序,啟動 HTTP 服務器。rootUP-TECH 04_webserver# ./httpdstarting httpd.press q to quit.wait for connection.此時 UP-

21、CUP210-II 型設備端 HTTP 服務器啟動并等待連接。 打開 PC 機 Windows XP 系統上的 IE 瀏覽器,在地址欄輸入 UP-CUP210-II 型設備 IP 地址: 99 。如圖 7 所示: 圖 7 輸入 IP 地址輸入正確的 IP 地址即可訪問 UP-CUP210-II 型設備上 HTTP 提供的服務。結果如下: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 嵌入式系統開發課程設計 135.1; SV1; QQPinyinSetup 620; CIBA; MAXTHON 2.0)Got buf1 Host: 99Got buf1 Connection: Keep-Alive瀏覽器端:如圖 8 所示:圖 8 瀏覽器端顯示嵌入式系統開發課程設計 14參考文獻參考文獻1 孫天澤,袁文菊,張海峰.嵌入式設計及 Linux 驅動開發指南基于 ARM9 處理器M.北京:電子工業出版社,20052 于明,范書瑞,曾祥燁.ARM9 嵌入式系統設計與開發教程M.北京:電子工業出版社,20063 王

24、田苗.嵌入式系統設計與實例開發M.北京:清華大學出版社,20034 Samsung Electronics.S3C2410X 32-Bit RISC Microprocessor Users Manual,20035 周立功等. ARM嵌入式Linux系統構建與驅動開發范例.北京:北京航空航天大學出版社,20066 鄭慕德. 編著 嵌入式微型計算機系統實例教程-ARM 與 LINUX. 科學出版社2006.77 王進德. 編著 嵌入式 LINUX 程序設計與應用案例. 中國電力出版社, 2007.58 王學龍著. 嵌入式 LINUX 系統設計與應用M .北京:清華大學出版社,20019 林宇,

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

26、程控制下位機進行 web 服務器的設計,使用 C 語言編程,生成目標文件,并且通過對宿主機下位機的相關上機操作,實現對書本內容的實際操作,鞏固加深對嵌入式系統的認知和了解,最終在此基礎上進行創新設計,了解了一個實際的網絡通訊應用程序整體設計后,我們共同編寫 C 程序實現對服務器的訪問。 經過這段時間的學習、系統分析、方案論證、 硬件和軟件設計、 調試等的努力,完成了嵌入式 web 服務器的設計制作。在系統的設計制作過程中,確實遇到了各種各樣的問題,如調試思路正確但是沒有能夠進行找到合適的方法進行進一步的實驗,設計中對于程序的編寫以及目錄結構的認知上存在偏差,其主要原因還是基礎功不扎實,把握系統

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

28、學習上和思想上都受益匪淺,這除了自身的努力外,與指導的老師、同學的關心、支持和鼓勵是分不開的。 做課程設計是一次再系統的學習,課程設計的完成,讓我在其中學到了許多,尤其是學會了合作,懂得了合作早就的效益和成果。在這里再次感謝和我一起搭檔的同學,還有對我們精心指導的老師!嵌入式系統開發課程設計 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; 嵌入式系統開發課程設計 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、;嵌入式系統開發課程設計 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;嵌入式系統開發課程設計 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;嵌入式系統開發課程設計 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;嵌入式系統開發課程設計 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); 嵌入式系統開發課程設計 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論