linux下http服務器設計畢業(yè)論文_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  畢業(yè)論文</b></p><p><b>  目錄</b></p><p><b>  摘要v</b></p><p>  Abstractvi</p><p><b>  前言vii</b></p>&l

2、t;p>  第一章 緒 論1</p><p><b>  1.1課題背景1</b></p><p>  1.2 課題研究的目的和意義1</p><p>  第二章HTTP服務器的相關理論基礎3</p><p>  2.1 Linux系統(tǒng)簡介3</p><p>  2.2 TC

3、P/IP協(xié)議分析4</p><p>  2.2.1 TCP/IP協(xié)議概述4</p><p>  2.2.2 網(wǎng)絡層協(xié)議(IP協(xié)議)5</p><p>  2.2.3 傳輸層協(xié)議(TCP和UDP)7</p><p>  2.3 Linux下網(wǎng)絡編程介紹9</p><p>  2.3.1 Socket簡介10&

4、lt;/p><p>  2.3.2 Socket創(chuàng)建10</p><p>  2.3.3 Socket配置11</p><p>  2.3.4 建立連接13</p><p>  2.3.5 數(shù)據(jù)傳輸14</p><p>  2.3.6 結束傳輸15</p><p>  2.3.7 Sock

5、et編程的基本步驟16</p><p>  2.3.8 I/O復用介紹16</p><p>  2.3.9 Linux下的I/O復用支持17</p><p>  2.3.10 Linux下EPOLL的使用19</p><p>  2.4 HTTP協(xié)議分析22</p><p>  2.4.1 HTTP協(xié)議概述

6、22</p><p>  2.4.2 HTTP工作原理23</p><p>  2.4.3 HTTP請求報文分析25</p><p>  2.4.3 HTTP響應報文分析26</p><p>  2.4.4 HTTP/1.0主要特征27</p><p>  2.4.5 HTTP/1.1簡介28</p&g

7、t;<p>  2.5 本章小結29</p><p>  第三章 HTTP服務器設計30</p><p>  3.1需求分析30</p><p>  3.2 HTTP服務器模型30</p><p>  3.3 HTTP服務器實現(xiàn)目標31</p><p>  3.4 HTTP服務器設計思路31&

8、lt;/p><p>  3.5 HTTP服務器功能模塊圖32</p><p>  3.6 HTTP服務器工作流程32</p><p>  3.7 HTTP服務器核心設計思想35</p><p>  3.8 本章小結35</p><p>  第四章 HTTP服務器實現(xiàn)36</p><p> 

9、 4.1 網(wǎng)絡連接模塊36</p><p>  4.1.1 數(shù)據(jù)結構與接口設計36</p><p>  4.1.2 epoll接口實現(xiàn)37</p><p>  4.2 HTTP協(xié)議處理模塊39</p><p>  4.2.1 數(shù)據(jù)結構與接口設計39</p><p>  4.3 HTTP服務提供模塊42<

10、;/p><p>  4.3.1 數(shù)據(jù)結構與接口設計42</p><p>  4.4 HTTP服務主程序44</p><p>  4.5 HTTP服務器運行與測試45</p><p>  4.5.1 HTTP服務器運行45</p><p>  4.5.2 HTTP服務器測試46</p><p&g

11、t;  4.6 本章小結49</p><p><b>  第五章 結論50</b></p><p>  第六章 總結與體會51</p><p><b>  謝辭52</b></p><p><b>  參考文獻53</b></p><p>&l

12、t;b>  附錄55</b></p><p>  附錄1 軟件使用說明55</p><p>  附錄2 英文原文57</p><p>  附錄3 英文翻譯58</p><p><b>  摘要</b></p><p>  Linux操作系統(tǒng)是一個開放源代碼的免費操作

13、系統(tǒng)。它不僅有安全、穩(wěn)定、成本低的特點,而且很少發(fā)現(xiàn)有病毒傳播。HTTP服務器是web服務器的一種,它是基于超文本傳輸協(xié)議HTTP的服務器?;贚inux具有穩(wěn)定、可靠、安全和強大的網(wǎng)絡功能這些優(yōu)點,使得其主要應用于服務器領域。所以本文選擇在Linux環(huán)境下實現(xiàn)一個HTTP服務器。</p><p>  本文研究了Linux下HTTP服務器的設計與實現(xiàn)。在Linux系統(tǒng)中采用HTTP協(xié)議和瀏覽器完成數(shù)據(jù)的傳輸。闡述

14、了Linux套接字編程的方法、EPOLL等I/O復用編程模型。詳細分析了HTTP協(xié)議內(nèi)容以及客戶端與服務器之間的通信過程。本文實現(xiàn)了客戶端瀏覽器和服務器端以HTTP協(xié)議進行請求和響應的功能。同時對服務器進行了一個簡單的壓力測試。所有程序代碼均為Linux下的C語言編程。</p><p>  關鍵字: Linux、HTTP服務器、HTTP協(xié)議、EPOLL</p><p><b> 

15、 Abstract</b></p><p>  The Linux operate system is a free operate system which opens a source code.Not only it has characteristics such as safe,stability,and the low cost,but also it seldom disseminate

16、s the Virus.HTTP server is one of the Web servers and it bases on HTTP protocol.As the Linux operating system has the function of stable,reliable,safe and powerful network, it mainly used in servers.To realize a HTTP ser

17、ver in the Linux environment is the best choice.</p><p>  This paper introduces design and implement of HTTP server in Linux operating system.In the Linux system and browser used HTTP protocol for data trans

18、mission. 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

19、 the function that the client browser requests and the server responds by HTTP agreement.Make a simple pressure test on the server.</p><p>  Keyword: Linux, HTTP Server, HTTP protocol, EPOLL</p><p

20、><b>  前言</b></p><p>  隨著Internet的迅速發(fā)展與普及,網(wǎng)絡已經(jīng)延伸到世界的各個角落。在該技術基礎上發(fā)展起來的www,通過超文本向用戶提供全方位的多媒體、超媒體信息,從而為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。由于用戶在通過 Web 瀏覽器訪問信息資源的過程中,無需再關心一些技術性的細節(jié),而且界面非常友好,因而 Web 在Inte

21、rnet 上一推出就受到了熱烈的歡迎,走紅全球,并迅速得到了爆炸性的發(fā)展。 所以Web服務器在網(wǎng)絡中的地位日益重要。當今社會中已有了許多知名的商用服務器,如Microsoft IIS、IBM WebSphere、BEA WebLogic、Apache、Tomcat等。但往往這些功能強大的服務器其結構也相當復雜,規(guī)模較大,在一些特定應用情景下(如嵌入式設備)就不太適合了。同時一個簡單小巧的服務器也有利于我們學習網(wǎng)絡編程的相關知識,對服務器

22、原理也能有進一步的了解。</p><p>  本文設計實現(xiàn)了一個功能簡單、結構小巧的HTTP服務器,采用EPOLL多路I/O復用機制來實現(xiàn)并發(fā)服務。網(wǎng)絡編程采用socket,服務器端創(chuàng)建套接字、綁定套接口、設置套接口為監(jiān)聽模式,將該監(jiān)聽套接字加入EPOLL事件列表,然后無限循環(huán)等待EPOLL返回,對返回事件的套接字進行讀或?qū)懙奶幚?。若為新連接,則將其加入到EPOLL事件列表;若為已有連接則讀取其請求或向其發(fā)送響應

23、;若客戶端已斷開或已發(fā)送完響應,服務器端就斷開該連接,并將該套接字從EPOLL事件列表中移除。主要提供對靜態(tài)請求的處理,解析客戶端請求報文,回送請求的文件和響應報文的功能。</p><p><b>  第一章 緒 論</b></p><p><b>  1.1課題背景</b></p><p>  隨著Internet的

24、迅速發(fā)展與普及,網(wǎng)絡已經(jīng)延伸到世界的各個角落。在該技術基礎上發(fā)展起來的www,通過超文本向用戶提供全方位的多媒體、超媒體信息,從而為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。隨著計算機網(wǎng)絡技術的發(fā)展,客戶/服務器(Client/Server)結構逐漸向瀏覽器/服務器(Browser/Server)結構遷移,B/S方式已成為一種時尚,大部分網(wǎng)絡應用系統(tǒng)都是以這種B/S方式與網(wǎng)絡用戶交換信息。B/S的基礎是客戶端要有一

25、個瀏覽器程序,服務器端要有一個與之對應的Web服務器。所以,Web服務器在B/S方式下起著決定性的作用,且其應用地位日益重要。</p><p>  Linux系統(tǒng)憑借其開源、穩(wěn)定、高效的特點,在服務器市場擁有較大的市場份額。Linux作為網(wǎng)絡服務器市場的佼佼者,網(wǎng)絡服務應用是其精華與核心。</p><p>  當前商用的服務器大都規(guī)模比較大,功能強大的同時結構也比較復雜。自己實現(xiàn)一個簡單小

26、巧的HTTP服務器,對于理解服務器工作原理知識,或針對一些特定情景下的HTTP服務器應用來說,不失為一種比較好的方式。</p><p>  1.2 課題研究的目的和意義</p><p>  隨著Internet的普及,網(wǎng)絡已經(jīng)深入到了我們的生活,跟我們息息相關。Linux系統(tǒng)作為網(wǎng)絡應用的重要平臺,如何更好的去學習和使用Linux系統(tǒng)便是我們要面對的問題。同時,作為當今互聯(lián)網(wǎng)最主要的應用

27、——www服務,其為全世界的Internet用戶提供了一種獲取信息、共享資源的途徑。www服務主要的提供者就是其后端的HTTP服務器,所以如何更為高效的研究和學習Web服務器的相關知識,也是我們必須要關注的。</p><p>  本文在Linux環(huán)境下設計和實現(xiàn)了一個簡單的HTTP服務器。使用socket庫完成網(wǎng)絡底層的通信,使用HTTP協(xié)議來和客戶端進行數(shù)據(jù)傳輸,使用EPOLL多路I/O復用機制來完成并發(fā)服務,

28、最后還進行了一個簡單的并發(fā)性能測試。通過對此課題的研究學習,我們能更好的掌握Linux系統(tǒng)的使用,加深對HTTP協(xié)議的理解。同時能對服務器設計的相關理論和實踐有一定了解。</p><p>  第二章HTTP服務器的相關理論基礎</p><p>  本章主要介紹設計HTTP服務器的相關理論知識。包括Linux系統(tǒng)簡介、TCP/IP協(xié)議分析、Linux下網(wǎng)絡編程介紹、HTTP協(xié)議分析。<

29、/p><p>  2.1 Linux系統(tǒng)簡介</p><p>  簡單地說,Linux是一套免費使用和自由傳播的類Unix操作系統(tǒng),它主要用于基于x86系列CPU的計算機上。這個系統(tǒng)是由世界各地的成千上萬的程序員設計和實現(xiàn)的。其目的是建立不受任何商品化軟件的版權制約的、全世界都能自由使用的Unix兼容產(chǎn)品。 </p><p>  Linux以它的高效性和靈活性著稱。Li

30、nux模塊化的設計結構,使得它既能在價格昂貴的工作站上運行,也能夠在廉價的PC機上實現(xiàn)全部的Unix特性,具有多任務、多用戶的能力。Linux是在GNU(GNU’s Not Unix)公共許可權限下免費獲得的,是一個符合POSIX標準的操作系統(tǒng)。Linux操作系統(tǒng)軟件包不僅包括完整的Linux操作系統(tǒng),而且還包括了文本編輯器、高級語言編譯器等應用軟件。它還包括帶有多個窗口管理器的X.Windows圖形用戶界面,如同我們使用Windows

31、NT一樣,允許我們使用窗口、圖標和菜單對系統(tǒng)進行操作。Linux具有Unix的優(yōu)點:穩(wěn)定、可靠、安全,有強大的網(wǎng)絡功能。在相關軟件的支持下,可實現(xiàn)WWW、FTP(File Transfer Protoc01)、DNS(Domain Name System)、DHCP((Dynamic Host Configure Protocol,動態(tài)主機配置協(xié)議)、Email等服務,還可作為路由器使用,利用ipchains/iptables可構建NA

32、T(Network Address Translation,網(wǎng)絡地址轉(zhuǎn)換)及功能</p><p>  現(xiàn)在,Linux已經(jīng)成為了一種受到廣泛關注和支持的操作系統(tǒng)。包括國際商用機器公司和惠普、戴爾在內(nèi)的一些計算機業(yè)巨頭也陸續(xù)支持Linux,并且成立了一些組織支持其發(fā)展,如Open Invention Network(OIN)(成員有IBM,索尼,NEC,Philips,Novell,Red hat等)購買了微軟專利

33、,允許任何個體以開放的原則使用。很多人認為,和微軟Windows相比,作為自由軟件的Linux具有低軟件成本,高安全性,更加可信賴等優(yōu)勢,但是同時卻需要更多的人力成本。 </p><p>  2.2 TCP/IP協(xié)議分析</p><p>  由于當今世界上的絕大部分網(wǎng)絡程序都是建立TCP/IP(傳輸控制協(xié)議/網(wǎng)際協(xié)議)協(xié)議的基礎上的。所以有必要對TCP/IP的協(xié)議內(nèi)容有所了解。這一節(jié)主要對

34、TCP/IP協(xié)議進行分析。</p><p>  2.2.1 TCP/IP協(xié)議概述</p><p>  TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡層、傳輸層、會話層、表示層和應用層。而TCP/IP通訊協(xié)議采用了

35、4層的層級結構,每一層都呼叫它的下一層所提供的網(wǎng)絡來完成自己的需求。這4層分別為:</p><p>  應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡遠程訪問協(xié)議(Telnet)等。</p><p>  傳輸層:在此層中,它提供了節(jié)點間的數(shù)據(jù)傳送,應用程序之間的通信服務,主要功能是數(shù)據(jù)格式化、數(shù)據(jù)確認和丟失重傳等。如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)

36、報協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負責傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達并接收。</p><p>  互連網(wǎng)絡層:負責提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達目的主機(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。</p><p>  鏈路接口層:接收IP數(shù)據(jù)報并進行傳輸,從網(wǎng)絡上接收物理幀,抽取IP數(shù)據(jù)報轉(zhuǎn)交給下一層,對實際的網(wǎng)絡媒

37、體的管理,定義如何使用實際網(wǎng)絡(如Ethernet、Serial Line等)來傳送數(shù)據(jù)。 </p><p>  圖2-1 TCP/IP層次結構圖</p><p>  2.2.2 網(wǎng)絡層協(xié)議(IP協(xié)議)</p><p>  IP協(xié)議是網(wǎng)絡層的主要協(xié)議,是Internet最重要的協(xié)議。在IP協(xié)議中規(guī)定了在Internet上進行通信時應遵守的規(guī)則。例如IP數(shù)據(jù)包的組成、

38、路由器如何將IP數(shù)據(jù)包送到目的主機等。IP協(xié)議在主機和網(wǎng)絡之間尋址和路由數(shù)據(jù)包。IP是一個無連接的協(xié)議,主要負責在主機間尋址并為數(shù)據(jù)包設定路由,在交換數(shù)據(jù)前它并不建立會話。因為它不保證正確傳遞。另一方面,數(shù)據(jù)在被收到時,IP不需要收到確認,所以它是不可靠的。</p><p>  IP層接收由更低層(網(wǎng)絡接口層例如以太網(wǎng)設備驅(qū)動程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層——TCP或UDP層;相反,IP層也把從TC

39、P或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包中含有發(fā)送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。</p><p>  IP協(xié)議的數(shù)據(jù)格式如下:</p><p>  圖2-2 網(wǎng)際協(xié)議IP數(shù)據(jù)格式</p><p>  版本號:協(xié)議的版本號,不同版本的協(xié)議格式或語言可能不同,現(xiàn)在常用的是IPV4。</p><p>  生存時

40、間(Time To Live,TTL):8bit,即IP分組在IP網(wǎng)絡中的壽命。</p><p>  協(xié)議(Protocol):8bit,指明IP分組中數(shù)據(jù)字段攜帶的是哪種高層協(xié)議的數(shù)據(jù)。</p><p>  首部檢查和(header checksum):16bit。此字段只用于檢查IP分組的首部,不包括數(shù)據(jù)字段。</p><p>  源IP地址(source IP

41、 address):32bit,填入源主機的IP地址。</p><p>  目標IP地址(destination IP address):32bit,填入目標主機的IP地址。</p><p>  可選字段(IP options):可選,可變長,1字節(jié)-40字節(jié),但加上填充字段(填充0)后兩個字段長度必須為4Bytes的整數(shù)倍。</p><p>  IP地址標識著網(wǎng)絡

42、中一個系統(tǒng)的位置。我們知道每個IP地址都是由兩部分組成的:網(wǎng)絡號和主機號。其中網(wǎng)絡號標識一個物理的網(wǎng)絡,同一個網(wǎng)絡上所有主機需要同一個網(wǎng)絡號,該號在互聯(lián)網(wǎng)中是唯一的;而主機號確定網(wǎng)絡中的一個工作端、服務器、路由器及其它TCP/IP客戶端。對于同一個網(wǎng)絡號來說,主機號是唯一的。每個TCP/IP主機由一個邏輯IP地址確定。</p><p>  2.2.3 傳輸層協(xié)議(TCP和UDP)</p><p

43、><b>  TCP協(xié)議</b></p><p>  傳輸控制協(xié)議TCP是一種面向連接(連接導向)的、可靠的、基于字節(jié)流的運輸層通信協(xié)議,由IETF的RFC 793說明。它在傳送數(shù)據(jù)時是分段進行的,主機交換數(shù)據(jù)必須建立一個會話。它用比特流通信,即數(shù)據(jù)被作為無結構的字節(jié)流。通過每個TCP傳輸?shù)淖侄沃付樞蛱?,以獲得可靠性。如果一個分段被分解成幾個小段,接收主機會知道是否所有小段都已收到。

44、通過發(fā)送應答,用以確認別的主機收到了數(shù)據(jù)。對于發(fā)送的每一個小段,接收主機必須在一個指定的時間返回一個確認。如果發(fā)送者未收到確認,數(shù)據(jù)會被重新發(fā)送;如果收到的數(shù)據(jù)段損壞,接收主機會舍棄它,因為確認未被發(fā)送,發(fā)送者會重新發(fā)送分段。TCP端口為信息的傳送指定端口,端口號小于256的定義為常用端口。</p><p>  下圖展示了TCP首部的數(shù)據(jù)格式。如果不計任選(Options)字段,那么,它的大小是20個字節(jié)。 &l

45、t;/p><p>  圖2-3 TCP包頭格式</p><p>  TCP協(xié)議通過三個報文段完成連接的建立,這個過程稱為三次握手(three-way handshake),過程如下圖所示。 </p><p>  (1)客戶機向服務器發(fā)送一個TCP數(shù)據(jù)包,表示請求建立連接。</p><p>  (2)服務器收到了數(shù)據(jù)包,知道這是一個建立請求的連接,

46、服務器也通過發(fā)回具有以下項目的數(shù)據(jù)包表示回復:同步標志置位、即將發(fā)送的數(shù)據(jù)段的起始字節(jié)的順序號、應答并帶有將收到的下一個數(shù)據(jù)段的字節(jié)順序號。</p><p>  (3)客戶機收到了服務器的TCP,知道是從服務器來的確認信息。于是客戶機也向服務器發(fā)送確認信息。至此客戶端完成連接。</p><p>  (4)服務器收到確認信息,也完成連接。</p><p>  圖2-4

47、 TCP建立連接(三次握手)</p><p>  TCP協(xié)議建立一個連接需要三次握手,而終止一個連接要經(jīng)過四次握手,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示。 </p><p>  圖2-5 TCP斷開連接</p><p><b>  UDP協(xié)議</b></p><p>  UDP 是Use

48、r Datagram Protocol的簡稱,中文名是用戶數(shù)據(jù)包協(xié)議,是 OSI 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務的簡單不可靠信息傳送服務。</p><p>  用戶數(shù)據(jù)報協(xié)議UDP提供了無連接的數(shù)據(jù)報服務。它適用于無須應答并且通常一次只傳送少量數(shù)據(jù)的應用軟件。</p><p>  2.3 Linux下網(wǎng)絡編程介紹</p><p>  Linux下的網(wǎng)

49、絡編程主要是基于Linux提供的Socket API 函數(shù)來進行的。所以,Linux下的網(wǎng)絡編程的基礎就是對socket API函數(shù)的掌握,就必須理解和學會使用socket接口。同時針對并發(fā)服務,Linux下提供了I/O復用等高效的形式來滿足并發(fā)的要求。</p><p>  2.3.1 Socket簡介</p><p>  Socket接口是TCP/IP網(wǎng)絡的API。Socket接口定義了

50、許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡上的應用程序。要學習Internet上的TCP/IP網(wǎng)絡編程,必須理解Socket接口。    </p><p>  Socket接口設計者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡的 Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似于打開文件

51、的函數(shù)調(diào)用Socket(),該函數(shù)返回一個整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實現(xiàn)的。常用的Socket類型有兩種:流式Socket (SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務應用;數(shù)據(jù)報式Socket是一種無連接的Socket,對應于無連接的UDP服務應用。 </p><p> 

52、 2.3.2 Socket創(chuàng)建</p><p>  為了創(chuàng)建Socket,程序可以調(diào)用Socket函數(shù),該函數(shù)返回一個類似于文件描述符的句柄。socket函數(shù)原型為:</p><p>  int socket(int domain, int type, int protocol);</p><p>  domain指明所使用的協(xié)議族,通常為PF_INET,表示互聯(lián)網(wǎng)

53、協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型: SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協(xié)議;protocol通常賦值“0”。 Socket()調(diào)用返回一個整型socket描述符,你可以在后面的調(diào)用使用它。</p><p>  Socket描述符是一個指向內(nèi)部數(shù)據(jù)結構的指針,它指向描述符表入口。調(diào)用Socke

54、t函數(shù)時,socket執(zhí)行體將建立一個Socket,實際上"建立一個Socket"意味著為一個Socket數(shù)據(jù)結構分配存儲空間。Socket執(zhí)行體為你管理描述符表。</p><p>  兩個網(wǎng)絡程序之間的一個網(wǎng)絡連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機端口、遠端主機地址和遠端協(xié)議端口。Socket數(shù)據(jù)結構中包含這五種信息。 </p><p>  2.3.3 S

55、ocket配置 </p><p>  通過socket調(diào)用返回一個socket描述符后,在使用socket進行網(wǎng)絡傳輸以前,必須配置該socket。面向連接的socket客戶端通過調(diào)用Connect函數(shù)在socket數(shù)據(jù)結構中保存本地和遠端信息。無連接socket的客戶端和服務端以及面向連接socket的服務端通過調(diào)用 bind函數(shù)來配置本地信息。</p><p>  Bind函數(shù)將soc

56、ket與本機上的一個端口相關聯(lián),隨后你就可以在該端口監(jiān)聽服務請求。Bind函數(shù)原型為:</p><p>  int bind(int sockfd,struct sockaddr *my_addr, int addrlen);</p><p>  Sockfd是調(diào)用socket函數(shù)返回的socket描述符,my_addr是一個指向包含有本機IP地址及端口號等信息的sockaddr類型的指針

57、;addrlen常被設置為sizeof(struct sockaddr)。</p><p>  struct sockaddr結構類型是用來保存socket信息的:</p><p>  struct sockaddr {</p><p>  unsigned short sa_family; /* 地址族, AF_xxx */</p><p>

58、;  char sa_data[14]; /* 14 字節(jié)的協(xié)議地址 */</p><p><b>  };</b></p><p>  sa_family一般為AF_INET,代表Internet(TCP/IP)地址族;sa_data則包含該socket的IP地址和端口號。</p><p>  另外還有一種結構類型:</p>&

59、lt;p>  struct sockaddr_in {</p><p>  short int sin_family; /* 地址族 */</p><p>  unsigned short int sin_port; /* 端口號 */</p><p>  struct in_addr sin_addr; /* IP地址 *</p><p&

60、gt;  unsigned char sin_zero[8]; /* 填充0 以保持與struct sockaddr同樣大小 */</p><p><b>  };</b></p><p>  這個結構更方便使用。sin_zero用來將sockaddr_in結構填充到與struct sockaddr同樣的長度,可以用bzero()或memset()函數(shù)將其置為零。指向

61、sockaddr_in 的指針和指向sockaddr的指針可以相互轉(zhuǎn)換,這意味著如果一個函數(shù)所需參數(shù)類型是sockaddr時,你可以在函數(shù)調(diào)用的時候?qū)⒁粋€指向 sockaddr_in的指針轉(zhuǎn)換為指向sockaddr的指針;或者相反。</p><p>  使用bind函數(shù)時,可以用下面的賦值實現(xiàn)自動獲得本機IP地址和隨機獲取一個沒有被占用的端口號:</p><p>  my_addr.sin

62、_port = 0; /* 系統(tǒng)隨機選擇一個未被使用的端口號 */</p><p>  my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本機IP地址 */</p><p>  通過將my_addr.sin_port置為0,函數(shù)會自動為你選擇一個未占用的端口來使用。同樣,通過將my_addr.sin_addr.s_addr置為INADDR_ANY,系統(tǒng)會

63、自動填入本機IP地址。注意在使用bind函數(shù)是需要將sin_port和sin_addr轉(zhuǎn)換成為網(wǎng)絡字節(jié)優(yōu)先順序;而sin_addr則不需要轉(zhuǎn)換。</p><p>  計算機數(shù)據(jù)存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。Internet上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡上傳輸,所以對于在內(nèi)部是以低位字節(jié)優(yōu)先方式存儲數(shù)據(jù)的機器,在Internet上傳輸數(shù)據(jù)時就需要進行轉(zhuǎn)換,否則就會出現(xiàn)數(shù)據(jù)不一致。下面是幾個字節(jié)

64、順序轉(zhuǎn)換函數(shù):</p><p>  ·htonl():把32位值從主機字節(jié)序轉(zhuǎn)換成網(wǎng)絡字節(jié)序</p><p>  ·htons():把16位值從主機字節(jié)序轉(zhuǎn)換成網(wǎng)絡字節(jié)序</p><p>  ·ntohl():把32位值從網(wǎng)絡字節(jié)序轉(zhuǎn)換成主機字節(jié)序</p><p>  ·ntohs():把16位值從網(wǎng)絡

65、字節(jié)序轉(zhuǎn)換成主機字節(jié)序</p><p>  Bind()函數(shù)在成功被調(diào)用時返回0;出現(xiàn)錯誤時返回“-1”并將errno置為相應的錯誤號。需要注意的是,在調(diào)用bind函數(shù)時一般不要將端口號置為小于1024的值,因為1到1024是保留端口號,你可以選擇大于1024中的任何一個沒有被占用的端口號。</p><p>  2.3.4 建立連接</p><p><b>

66、;  第六章 總結與體會</b></p><p>  畢業(yè)設計最初的時候,主要是對相關資料的收集和理論知識的學習。在這個階段,最好是同時結合資料和源碼一起來看,效果會比較好,學習效率較高??促Y料和教程是從細節(jié)和基礎上去學習知識,而看相關程序的源碼則是從整體和實現(xiàn)上去了解一個系統(tǒng)。這樣才能做到“見樹又見林”。學習理論知識可以使我們掌握最基礎的知識,能更深入的了解設計的底層實現(xiàn)。當在具體實現(xiàn)的時候,可以以

67、模塊或分層次的思想來分析系統(tǒng)。重點掌握核心的模塊,其他模塊可以采用現(xiàn)有的類庫或開源的實現(xiàn),這樣可以提高開發(fā)的效率。軟件開發(fā)其實對于代碼量的積累是很重要的。當積累了一定的代碼量后,看問題就會比較有程序的思想,能夠從層次,模塊的角度來分析問題,這樣思路就比較清晰了。</p><p>  整個畢業(yè)設計的過程其實就是經(jīng)歷了一個項目的生命周期。從最初的選題確定后,開始進行相關資料的收集和理論知識的學習,接著確定自己的方案設

68、計和系統(tǒng)整體結構,然后開始編碼實現(xiàn),調(diào)試代碼,直至順利運行,再進行性能測試,最后寫出論文。這些步驟其實和一個軟件項目的開發(fā)是很類似的。軟件的開發(fā)同樣會有這些步驟,需求分析,設計,編碼,測試,發(fā)布,文檔撰寫等。</p><p>  當完成了整個畢業(yè)設計后,對如何把握一個項目的整體有了一點基本的認識。同時從中體會到時間控制和進度安排都是很重要的,任何任務和項目都是有時間期限的,自己的想法和設計都是得基于按時完成這個前

69、提的。</p><p>  四年的大學時光即將結束,心中還是有不舍?;仡櫵哪甑膶W習時光,感覺自己還是過的蠻充實的。做過很多有意思的事,也認識了一幫好友與同窗。無論是做人還是學習,我的老師和同學朋友們都給了我很大的幫助,我非常感謝他們。作為即將踏上工作、步入社會的我,我想我會更加努力奮斗,不讓我的家人、朋友、老師們失望。最后,愿大家在今后的日子里,一帆風順,身體健康。</p><p><

70、;b>  謝辭</b></p><p>  本論文的工作是在我的指導老師**老師的悉心指導下完成的,謝濤老師創(chuàng)新的學習思想和積極奮斗的人生理念給了我很大的影響,同時對我的工作和人生規(guī)劃都有很大幫助。在此衷心的感謝謝濤老師。</p><p>  在大學四年的學習過程中,我學到了很多做人與做事的學問,度過了一個充實而快樂的大學時光。非常感謝各位親愛的老師對我的教誨和指導,無論

71、是知識的學習,還是職業(yè)規(guī)劃和人生理想,你們都給了我很多意見和指導。我也很榮幸我能和各位同學、朋友們一起走過大學四年,我們共同經(jīng)歷了人生中最美好的時光。感謝你們的幫助和鼓勵,希望走出校門后的我們?nèi)匀皇且惠呑拥暮门笥选?lt;/p><p>  最后,我要感謝我的父母和親人。是你們的辛勤工作為我創(chuàng)造了良好的學習條件,是你們的信任、鼓勵和理解,我才會取得今天的成就。我會用我的努力工作來回報你們的養(yǎng)育之恩,希望你們永遠身體健康

72、,快樂長壽。</p><p><b>  參考文獻</b></p><p>  [1] JAMES F.KUROSE,KEITH W.ROSS.計算機網(wǎng)絡——自頂向下方法與Internet特色. 北京:機械工業(yè)出版社,2005年</p><p>  [2] W.RICHARD STEVENS,BILL FENNER,ANDREW M.RUDOF

73、F. UNIX網(wǎng)絡編程 第1卷套接口API. 北京:清華大學出版社,2006年6月第3版</p><p>  [3] W.RICHARD STEVENS,STEPHEN A.RAGO. UNIX環(huán)境高級編程(第2版).北京:人民郵電出版社,2006年</p><p>  [4] 鳥哥.鳥哥的Linux私房菜基礎學習篇.北京:人民郵電出版社,2007年9月</p><p&

74、gt;  [5] 林宇,郭凌云.Linux網(wǎng)絡編程.北京:人民郵電出版社,2000.45—65</p><p>  [6] 鄭齊,方思行.通用多線程服務器的設計與實現(xiàn).計算機工程與應用,2003.16:146—147</p><p>  [7] 胥光輝等譯.W.RICHARD STEVENS. TCP/IP詳解(第l卷):協(xié)議.北京:機械工業(yè)出版社,2000.15—25.</p>

75、;<p>  [8] 張南平,徐靜. 基于進程池的Linux并發(fā)服務器的研究. 計算機與數(shù)字工程,2009.1:159—161</p><p>  [9] 邵芬,于國防,張寧. 基于多線程的HTTP服務器的設計與實現(xiàn).工礦自動化,2007.8:134—136</p><p>  [9] 孫霞. 基于java的高效多線程HTTP服務器的研究及實現(xiàn). 福建電腦,2003.11:3

76、8—39</p><p>  [10] 李磊. 嵌入式WEB服務器軟件的設計與實現(xiàn). 計算機工程與設計2003(10) </p><p>  [11]白小明, 邱桃榮.基于Linux的嵌入式實時操作系統(tǒng)的研究. 微計算機信息, 2006,2-2:78-7.</p><p>  [12]車飛鋒. 基于嵌入式Linux的Web和郵件服務器的設計與實現(xiàn). 西安石油大學:計

77、算機應用技術,2008 </p><p>  [13]曲波,吳兆芝. Linux環(huán)境下面向Web服務器的設計與實現(xiàn). 小型微型計算機系統(tǒng), 2002 </p><p>  [14] Dan Kegel.The C10K problem. </p><p>  [15]Jeff Darcy. High-Performance Server Design. <

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論