




免費預覽已結束,剩余21頁可下載查看
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
畢業論文設計 畢業論文畢業設計(論文)題目:Linux下HTTP服務器設計學院:信息與自動化學院專業:通信工程年級:學生姓名:指導教師單位:通信工程系指導教師姓名:指導教師職稱: 畢業設計(論文)題目:Linux下HTTP服務器設計學院:信息與自動化學院專業:通信工程年級:學生姓名:指導教師單位:指導教師姓名:指導教師職稱:目錄摘要vAbstractvi前言vii第一章 緒 論11.1課題背景11.2 課題研究的目的和意義1第二章HTTP服務器的相關理論基礎32.1 Linux系統簡介32.2 TCP/IP協議分析42.2.1 TCP/IP協議概述42.2.2 網絡層協議(IP協議)52.2.3 傳輸層協議(TCP和UDP)72.3 Linux下網絡編程介紹92.3.1 Socket簡介102.3.2 Socket創建102.3.3 Socket配置112.3.4 建立連接132.3.5 數據傳輸142.3.6 結束傳輸152.3.7 Socket編程的基本步驟162.3.8 I/O復用介紹162.3.9 Linux下的I/O復用支持172.3.10 Linux下EPOLL的使用192.4 HTTP協議分析222.4.1 HTTP協議概述222.4.2 HTTP工作原理232.4.3 HTTP請求報文分析252.4.3 HTTP響應報文分析262.4.4 HTTP/1.0主要特征272.4.5 HTTP/1.1簡介282.5 本章小結29第三章HTTP服務器設計303.1需求分析303.2 HTTP服務器模型303.3 HTTP服務器實現目標313.4 HTTP服務器設計思路313.5 HTTP服務器功能模塊圖323.6 HTTP服務器工作流程323.7 HTTP服務器核心設計思想353.8 本章小結35第四章 HTTP服務器實現364.1 網絡連接模塊364.1.1 數據結構與接口設計364.1.2 epoll接口實現374.2 HTTP協議處理模塊394.2.1 數據結構與接口設計394.3 HTTP服務提供模塊424.3.1 數據結構與接口設計424.4 HTTP服務主程序444.5 HTTP服務器運行與測試454.5.1 HTTP服務器運行454.5.2 HTTP服務器測試464.6 本章小結49第五章 結論50第六章 總結與體會51謝辭52參考文獻53附錄55附錄1 軟件使用說明55附錄2 英文原文57附錄3 英文翻譯58 摘要Linux操作系統是一個開放源代碼的免費操作系統。它不僅有安全、穩定、成本低的特點,而且很少發現有病毒傳播。HTTP服務器是web服務器的一種,它是基于超文本傳輸協議HTTP的服務器。基于Linux具有穩定、可靠、安全和強大的網絡功能這些優點,使得其主要應用于服務器領域。所以本文選擇在Linux環境下實現一個HTTP服務器。本文研究了Linux下HTTP服務器的設計與實現。在Linux系統中采用HTTP協議和瀏覽器完成數據的傳輸。闡述了Linux套接字編程的方法、EPOLL等I/O復用編程模型。詳細分析了HTTP協議內容以及客戶端與服務器之間的通信過程。本文實現了客戶端瀏覽器和服務器端以HTTP協議進行請求和響應的功能。同時對服務器進行了一個簡單的壓力測試。所有程序代碼均為Linux下的C語言編程。關鍵字: Linux、HTTP服務器、HTTP協議、EPOLL AbstractThe Linux operate system is a free operate system which opens a source codeNot only it has characteristics such as safe,stability,and the low cost,but also it seldom disseminates the VirusHTTP server is one of the Web servers and it bases on HTTP protocolAs the Linux operating system has the function of stable,reliable,safe and powerful network, it mainly used in servers.To realize a HTTP server in the Linux environment is the best choiceThis paper introduces design and implement of HTTP server in Linux operating systemIn the Linux system and browser used HTTP protocol for data transmission. This paper expounds the method of Linux socket programming and EPOLL I/O multiplexing programming model.Detailed analysis the communication process between client and server and HTTP protocol.This paper realizes the function that the client browser requests and the server responds by HTTP agreement.Make a simple pressure test on the server.All program code use the C language programming in Linux operating system.Keyword: Linux, HTTP Server, HTTP protocol, EPOLL前言隨著Internet的迅速發展與普及,網絡已經延伸到世界的各個角落。在該技術基礎上發展起來的www,通過超文本向用戶提供全方位的多媒體、超媒體信息,從而為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。由于用戶在通過 Web 瀏覽器訪問信息資源的過程中,無需再關心一些技術性的細節,而且界面非常友好,因而 Web 在Internet 上一推出就受到了熱烈的歡迎,走紅全球,并迅速得到了爆炸性的發展。 所以Web服務器在網絡中的地位日益重要。當今社會中已有了許多知名的商用服務器,如Microsoft IIS、IBMWebSphere、BEA WebLogic、Apache、Tomcat等。但往往這些功能強大的服務器其結構也相當復雜,規模較大,在一些特定應用情景下(如嵌入式設備)就不太適合了。同時一個簡單小巧的服務器也有利于我們學習網絡編程的相關知識,對服務器原理也能有進一步的了解。本文設計實現了一個功能簡單、結構小巧的HTTP服務器,采用EPOLL多路I/O復用機制來實現并發服務。網絡編程采用socket,服務器端創建套接字、綁定套接口、設置套接口為監聽模式,將該監聽套接字加入EPOLL事件列表,然后無限循環等待EPOLL返回,對返回事件的套接字進行讀或寫的處理。若為新連接,則將其加入到EPOLL事件列表;若為已有連接則讀取其請求或向其發送響應;若客戶端已斷開或已發送完響應,服務器端就斷開該連接,并將該套接字從EPOLL事件列表中移除。主要提供對靜態請求的處理,解析客戶端請求報文,回送請求的文件和響應報文的功能。 第 vi 頁 第一章 緒 論1.1課題背景隨著Internet的迅速發展與普及,網絡已經延伸到世界的各個角落。在該技術基礎上發展起來的www,通過超文本向用戶提供全方位的多媒體、超媒體信息,從而為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。隨著計算機網絡技術的發展,客戶/服務器(Client/Server)結構逐漸向瀏覽器/服務器(Browser/Server)結構遷移,B/S方式已成為一種時尚,大部分網絡應用系統都是以這種B/S方式與網絡用戶交換信息。B/S的基礎是客戶端要有一個瀏覽器程序,服務器端要有一個與之對應的Web服務器。所以,Web服務器在B/S方式下起著決定性的作用,且其應用地位日益重要。Linux系統憑借其開源、穩定、高效的特點,在服務器市場擁有較大的市場份額。Linux作為網絡服務器市場的佼佼者,網絡服務應用是其精華與核心。當前商用的服務器大都規模比較大,功能強大的同時結構也比較復雜。自己實現一個簡單小巧的HTTP服務器,對于理解服務器工作原理知識,或針對一些特定情景下的HTTP服務器應用來說,不失為一種比較好的方式。1.2 課題研究的目的和意義隨著Internet的普及,網絡已經深入到了我們的生活,跟我們息息相關。Linux系統作為網絡應用的重要平臺,如何更好的去學習和使用Linux系統便是我們要面對的問題。同時,作為當今互聯網最主要的應用www服務,其為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。www服務主要的提供者就是其后端的HTTP服務器,所以如何更為高效的研究和學習Web服務器的相關知識,也是我們必須要關注的。本文在Linux環境下設計和實現了一個簡單的HTTP服務器。使用socket庫完成網絡底層的通信,使用HTTP協議來和客戶端進行數據傳輸,使用EPOLL多路I/O復用機制來完成并發服務,最后還進行了一個簡單的并發性能測試。通過對此課題的研究學習,我們能更好的掌握Linux系統的使用,加深對HTTP協議的理解。同時能對服務器設計的相關理論和實踐有一定了解。第二章HTTP服務器的相關理論基礎本章主要介紹設計HTTP服務器的相關理論知識。包括Linux系統簡介、TCP/IP協議分析、Linux下網絡編程介紹、HTTP協議分析。2.1 Linux系統簡介簡單地說,Linux是一套免費使用和自由傳播的類Unix操作系統,它主要用于基于x86系列CPU的計算機上。這個系統是由世界各地的成千上萬的程序員設計和實現的。其目的是建立不受任何商品化軟件的版權制約的、全世界都能自由使用的Unix兼容產品。 Linux以它的高效性和靈活性著稱。Linux模塊化的設計結構,使得它既能在價格昂貴的工作站上運行,也能夠在廉價的PC機上實現全部的Unix特性,具有多任務、多用戶的能力。Linux是在GNU(GNUs Not Unix)公共許可權限下免費獲得的,是一個符合POSIX標準的操作系統。Linux操作系統軟件包不僅包括完整的Linux操作系統,而且還包括了文本編輯器、高級語言編譯器等應用軟件。它還包括帶有多個窗口管理器的XWindows圖形用戶界面,如同我們使用WindowsNT一樣,允許我們使用窗口、圖標和菜單對系統進行操作。Linux具有Unix的優點:穩定、可靠、安全,有強大的網絡功能。在相關軟件的支持下,可實現WWW、FTP(File Transfer Protoc01)、DNS(Domain Name System)、DHCP(Dynamic Host Configure Protocol,動態主機配置協議)、Email等服務,還可作為路由器使用,利用ipchains/iptables可構建NAT(Network Address Translation,網絡地址轉換)及功能全面的防火墻。現在,Linux已經成為了一種受到廣泛關注和支持的操作系統。包括國際商用機器公司和惠普、戴爾在內的一些計算機業巨頭也陸續支持Linux,并且成立了一些組織支持其發展,如Open Invention Network(OIN)(成員有IBM,索尼,NEC,Philips,Novell,Red hat等)購買了微軟專利,允許任何個體以開放的原則使用。很多人認為,和微軟Windows相比,作為自由軟件的Linux具有低軟件成本,高安全性,更加可信賴等優勢,但是同時卻需要更多的人力成本。 2.2 TCP/IP協議分析由于當今世界上的絕大部分網絡程序都是建立TCP/IP(傳輸控制協議/網際協議)協議的基礎上的。所以有必要對TCP/IP的協議內容有所了解。這一節主要對TCP/IP協議進行分析。2.2.1 TCP/IP協議概述TCP/IP協議并不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通信協議的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。而TCP/IP通訊協議采用了4層的層級結構,每一層都呼叫它的下一層所提供的網絡來完成自己的需求。這4層分別為:應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網絡遠程訪問協議(Telnet)等。傳輸層:在此層中,它提供了節點間的數據傳送,應用程序之間的通信服務,主要功能是數據格式化、數據確認和丟失重傳等。如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據并把它傳輸到下一層中,這一層負責傳送數據,并且確定數據已被送達并接收。互連網絡層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。鏈路接口層:接收IP數據報并進行傳輸,從網絡上接收物理幀,抽取IP數據報轉交給下一層,對實際的網絡媒體的管理,定義如何使用實際網絡(如Ethernet、Serial Line等)來傳送數據。 HTTP客戶端TCPIP以太網驅動HTTP服務器TCPIP以太網驅動HTTP協議TCP協議IP協議以太網協議應用層傳輸層網絡層鏈路層 圖2-1 TCP/IP層次結構圖2.2.2 網絡層協議(IP協議)IP協議是網絡層的主要協議,是Internet最重要的協議。在IP協議中規定了在Internet上進行通信時應遵守的規則。例如IP數據包的組成、路由器如何將IP數據包送到目的主機等。IP協議在主機和網絡之間尋址和路由數據包。IP是一個無連接的協議,主要負責在主機間尋址并為數據包設定路由,在交換數據前它并不建立會話。因為它不保證正確傳遞。另一方面,數據在被收到時,IP不需要收到確認,所以它是不可靠的。IP層接收由更低層(網絡接口層例如以太網設備驅動程序)發來的數據包,并把該數據包發送到更高層TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包中含有發送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。IP協議的數據格式如下:版本號(4)IHL(4)服務類型(8)數據包長度(16)標識(16)Flag(3)偏移量(13)生存時間(8)傳輸協議(8)校驗和(16)源地址(32)目的地址(32)選項(8)+ 填充數據圖2-2 網際協議IP數據格式版本號:協議的版本號,不同版本的協議格式或語言可能不同,現在常用的是IPV4。生存時間(Time To Live,TTL):8bit,即IP分組在IP網絡中的壽命。協議(Protocol):8bit,指明IP分組中數據字段攜帶的是哪種高層協議的數據。首部檢查和(header checksum):16bit。此字段只用于檢查IP分組的首部,不包括數據字段。源IP地址(source IP address):32bit,填入源主機的IP地址。目標IP地址(destination IP address):32bit,填入目標主機的IP地址。可選字段(IP options):可選,可變長,1字節40字節,但加上填充字段(填充0)后兩個字段長度必須為4Bytes的整數倍。IP地址標識著網絡中一個系統的位置。我們知道每個IP地址都是由兩部分組成的:網絡號和主機號。其中網絡號標識一個物理的網絡,同一個網絡上所有主機需要同一個網絡號,該號在互聯網中是唯一的;而主機號確定網絡中的一個工作端、服務器、路由器及其它TCP/IP客戶端。對于同一個網絡號來說,主機號是唯一的。每個TCP/IP主機由一個邏輯IP地址確定。2.2.3 傳輸層協議(TCP和UDP)1. TCP協議傳輸控制協議TCP是一種面向連接(連接導向)的、可靠的、基于字節流的運輸層通信協議,由IETF的RFC 793說明。它在傳送數據時是分段進行的,主機交換數據必須建立一個會話。它用比特流通信,即數據被作為無結構的字節流。通過每個TCP傳輸的字段指定順序號,以獲得可靠性。如果一個分段被分解成幾個小段,接收主機會知道是否所有小段都已收到。通過發送應答,用以確認別的主機收到了數據。對于發送的每一個小段,接收主機必須在一個指定的時間返回一個確認。如果發送者未收到確認,數據會被重新發送;如果收到的數據段損壞,接收主機會舍棄它,因為確認未被發送,發送者會重新發送分段。TCP端口為信息的傳送指定端口,端口號小于256的定義為常用端口。下圖展示了TCP首部的數據格式。如果不計任選(Options)字段,那么,它的大小是20個字節。 圖2-3 TCP包頭格式TCP協議通過三個報文段完成連接的建立,這個過程稱為三次握手(three-way handshake),過程如下圖所示。 (1)客戶機向服務器發送一個TCP數據包,表示請求建立連接。(2)服務器收到了數據包,知道這是一個建立請求的連接,服務器也通過發回具有以下項目的數據包表示回復:同步標志置位、即將發送的數據段的起始字節的順序號、應答并帶有將收到的下一個數據段的字節順序號。(3)客戶機收到了服務器的TCP,知道是從服務器來的確認信息。于是客戶機也向服務器發送確認信息。至此客戶端完成連接。(4)服務器收到確認信息,也完成連接。 圖2-4 TCP建立連接(三次握手)TCP協議建立一個連接需要三次握手,而終止一個連接要經過四次握手,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示。 圖2-5 TCP斷開連接2. UDP協議UDP 是User Datagram Protocol的簡稱,中文名是用戶數據包協議,是 OSI 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。用戶數據報協議UDP提供了無連接的數據報服務。它適用于無須應答并且通常一次只傳送少量數據的應用軟件。2.3 Linux下網絡編程介紹Linux下的網絡編程主要是基于Linux提供的Socket API 函數來進行的。所以,Linux下的網絡編程的基礎就是對socket API函數的掌握,就必須理解和學會使用socket接口。同時針對并發服務,Linux下提供了I/O復用等高效的形式來滿足并發的要求。2.3.1 Socket簡介Socket接口是TCP/IP網絡的API。Socket接口定義了許多函數或例程,程序員可以用它們來開發TCP/IP網絡上的應用程序。要學習Internet上的TCP/IP網絡編程,必須理解Socket接口。 Socket接口設計者最先是將接口放在Unix操作系統里面的。如果了解Unix系統的輸入和輸出的話,就很容易了解Socket了。網絡的 Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似于打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨后的連接建立、數據傳輸等操作都是通過該Socket實現的。常用的Socket類型有兩種:流式Socket (SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務應用;數據報式Socket是一種無連接的Socket,對應于無連接的UDP服務應用。 2.3.2 Socket創建為了創建Socket,程序可以調用Socket函數,該函數返回一個類似于文件描述符的句柄。socket函數原型為: int socket(int domain, int type, int protocol);domain指明所使用的協議族,通常為PF_INET,表示互聯網協議族(TCP/IP協議族);type參數指定socket的類型: SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協議;protocol通常賦值“0”。 Socket()調用返回一個整型socket描述符,你可以在后面的調用使用它。Socket描述符是一個指向內部數據結構的指針,它指向描述符表入口。調用Socket函數時,socket執行體將建立一個Socket,實際上建立一個Socket意味著為一個Socket數據結構分配存儲空間。Socket執行體為你管理描述符表。兩個網絡程序之間的一個網絡連接包括五種信息:通信協議、本地協議地址、本地主機端口、遠端主機地址和遠端協議端口。Socket數據結構中包含這五種信息。 2.3.3 Socket配置 通過socket調用返回一個socket描述符后,在使用socket進行網絡傳輸以前,必須配置該socket。面向連接的socket客戶端通過調用Connect函數在socket數據結構中保存本地和遠端信息。無連接socket的客戶端和服務端以及面向連接socket的服務端通過調用 bind函數來配置本地信息。Bind函數將socket與本機上的一個端口相關聯,隨后你就可以在該端口監聽服務請求。Bind函數原型為:int bind(int sockfd,struct sockaddr *my_addr, int addrlen);Sockfd是調用socket函數返回的socket描述符,my_addr是一個指向包含有本機IP地址及端口號等信息的sockaddr類型的指針;addrlen常被設置為sizeof(struct sockaddr)。struct sockaddr結構類型是用來保存socket信息的: struct sockaddr unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data14; /* 14 字節的協議地址 */;sa_family一般為AF_INET,代表Internet(TCP/IP)地址族;sa_data則包含該socket的IP地址和端口號。另外還有一種結構類型: struct sockaddr_in short int sin_family; /* 地址族 */ unsigned short int sin_port; /* 端口號 */ struct in_addr sin_addr; /* IP地址 * unsigned char sin_zero8; /* 填充0 以保持與struct sockaddr同樣大小 */;這個結構更方便使用。sin_zero用來將sockaddr_in結構填充到與struct sockaddr同樣的長度,可以用bzero()或memset()函數將其置為零。指向sockaddr_in 的指針和指向sockaddr的指針可以相互轉換,這意味著如果一個函數所需參數類型是sockaddr時,你可以在函數調用的時候將一個指向 sockaddr_in的指針轉換為指向sockaddr的指針;或者相反。使用bind函數時,可以用下面的賦值實現自動獲得本機IP地址和隨機獲取一個沒有被占用的端口號: my_addr.sin_port = 0; /* 系統隨機選擇一個未被使用的端口號 */ my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本機IP地址 */通過將my_addr.sin_port置為0,函數會自動為你選擇一個未占用的端口來使用。同樣,通過將my_addr.sin_addr.s_addr置為INADDR_ANY,系統會自動填入本機IP地址。注意在使用bind函數是需要將sin_port和sin_addr轉換成為網絡字節優先順序;而sin_addr則不需要轉換。計算機數據存儲有兩種字節優先順序:高位字節優先和低位字節優先。Internet上數據以高位字節優先順序在網絡上傳輸,所以對于在內部是以低位字節優先方式存儲數據的機器,在Internet上傳輸數據時就需要進行轉換,否則就會出現數據不一致。下面是幾個字節順序轉換函數:htonl():把32位值從主機字節序轉換成網絡字節序htons():把16位值從主機字節序轉換成網絡字節序ntohl():把32位值從網絡字節序轉換成主機字節序ntohs():把16位值從網絡字節序轉換成主機字節序 Bind()函數在成功被調用時返回0;出現錯誤時返回“-1”并將errno置為相應的錯誤號。需要注意的是,在調用bind函數時一般不要將端口號置為小于1024的值,因為1到1024是保留端口號,你可以選擇大于1024中的任何一個沒有被占用的端口號。2.3.4 建立連接第六章 總結與體會畢業設計最初的時候,主要是對相關資料的收集和理論知識的學習。在這個階段,最好是同時結合資料和源碼一起來看,效果會比較好,學習效率較高。看資料和教程是從細節和基礎上去學習知識,而看相關程序的源碼則是從整體和實現上去了解一個系統。這樣才能做到“見樹又見林”。學習理論知識可以使我們掌握最基礎的知識,能更深入的了解設計的底層實現。當在具體實現的時候,可以以模塊或分層次的思想來分析系統。重點掌握核心的模塊,其他模塊可以采用現有的類庫或開源的實現,這樣可以提高開發的效率。軟件開發其實對于代碼量的積累是很重要的。當積累了一定的代碼量后,看問題就會比較有程序的思想,能夠從層次,模塊的角度來分析問題,這樣思路就比較清晰了。整個畢業設計的過程其實就是經歷了一個項目的生命周期。從最初的選題確定后,開始進行相關資料的收集和理論知識的學習,接著確定自己的方案設計和系統整體結構,然后開始編碼實現,調試代碼,直至順利運行,再進行性能測試,最后寫出論文。這些步驟其實和一個軟件項目的開發是很類似的。軟件的開發同樣會有這些步驟,需求分析,設計,編碼,測試,發布,文檔撰寫等。當完成了整個畢業設計后,對如何把握一個項目的整體有了一點基本的認識。同時從中體會到時間控制和進度安排都是很重要的,任何任務和項目都是有時間期限的,自己的想法和設計都是得基于按時完成這個前提的。四年的大學時光即將結束,心中還是有不舍。回顧四年的學習時光,感覺自己還是過的蠻充實的。做過很多有意思的事,也認識了一幫好友與同窗。無論是做人還是學習,我的老師和同學朋友們都給了我很大的幫助,我非常感謝他們。作為即將踏上工作、步入社會的我,我想我會更加努力奮斗,不讓我的家人、朋友、老師們失望。最后,愿大家在今后的日子里,一帆風順,身體健康。謝辭本論文的工作是在我的指導老師老師的悉心指導下完成的,謝濤老師創新的學習思想和積極奮斗的人生理念給了我很大的影響
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論