計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì).ppt_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì).ppt_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì).ppt_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì).ppt_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第章計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì),8.1 套接口API的有關(guān)概念 8.2 基本Socket函數(shù) 8.3 基于TCP的socket程序設(shè)計(jì) 8.4 基于UDP的socket 程序設(shè)計(jì) 8.5 輸入輸出多路復(fù)用 8.6 并發(fā)服務(wù)器程序設(shè)計(jì),8.1 套接口API的有關(guān)概念,8.1.1 網(wǎng)絡(luò)應(yīng)用編程接口 Berkeley套接口API WinSock 遠(yuǎn)程過程調(diào)用(RPC),8.1.2 socket編程模型及類型 套接口可分如下5種類型:流式套接字、數(shù)據(jù)報(bào)套接字、原始套接字、SOCK_SEQPACKET及SOCK_RDM。 流式套接字定義了一種可靠的面向連接的服務(wù),實(shí)現(xiàn)了無差錯(cuò)的數(shù)據(jù)傳輸。 數(shù)據(jù)報(bào)套接字定義了一種無連接的服務(wù),數(shù)據(jù)通過相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無序的,并且不保證可靠。 原始套接字允許對(duì)低層協(xié)議如IP或ICMP直接訪問,主要用于新的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)的測(cè)試等。,Internet的Socket編程模型,8.1.3 socket地址應(yīng)用進(jìn)程的標(biāo)識(shí) Internet上兩臺(tái)主機(jī)種的進(jìn)程間要進(jìn)行通信,必須能夠互相識(shí)別。用于標(biāo)識(shí)進(jìn)程的信息有兩個(gè): 主機(jī)名或主機(jī)地址 主機(jī)內(nèi)部標(biāo)識(shí)進(jìn)程的標(biāo)識(shí)符 這兩部分合在一起,成為套接口地址(計(jì)算機(jī)通信的基礎(chǔ)構(gòu)筑塊 ),8.1.4 通信進(jìn)程的阻塞和非阻塞方式 對(duì)于運(yùn)行狀態(tài)中的進(jìn)程來說,當(dāng)某些條件不具備,如輸入輸出條件還沒有準(zhǔn)備好時(shí),該進(jìn)程可以有兩種處理方式:阻塞與非阻塞。 阻塞方式 在阻塞方式下,當(dāng)輸入輸出條件還沒有準(zhǔn)備好時(shí),就將進(jìn)程轉(zhuǎn)入阻塞狀態(tài),標(biāo)記阻塞原因,并保留當(dāng)前進(jìn)程現(xiàn)場(chǎng)信息,然后將控制轉(zhuǎn)入進(jìn)程調(diào)度程序,等阻塞原因解除后,將進(jìn)程狀態(tài)由阻塞變成就緒等待處理機(jī),或直接獲得由調(diào)度程序再次分配的處理機(jī),恢復(fù)阻塞的現(xiàn)場(chǎng)繼續(xù)執(zhí)行。 非阻塞方式 在非阻塞方式下,當(dāng)輸入輸出條件還沒有準(zhǔn)備好時(shí),進(jìn)程仍處于運(yùn)行狀態(tài),通過循環(huán),反復(fù)進(jìn)行某條件的查詢。一般說來,阻塞機(jī)制可以防止進(jìn)程在循環(huán)反復(fù)的查詢等待中造成資源浪費(fèi)。但是有時(shí)在應(yīng)用中需要進(jìn)程一直處于運(yùn)行狀態(tài),不希望進(jìn)程在對(duì)socket的操作中阻塞,這時(shí)就要使用非阻塞機(jī)制。,8.2 基本Socket函數(shù),8.2.1 初始化套接口服務(wù)綁定socket() 1、功能: 在應(yīng)用程序中使用插口API時(shí),首先要?jiǎng)?chuàng)建一個(gè)插口-socket。為了說明什么是socket,可以打個(gè)比方:一個(gè)電話插座,既可以接電話機(jī)打電話,也可以接傳真機(jī)發(fā)傳真,還可以接計(jì)算機(jī)上網(wǎng)。接上什么設(shè)備,就是綁定了什么服務(wù)。創(chuàng)建一個(gè)插口,就是創(chuàng)建一個(gè)通信,需要指定提供什么服務(wù),即為一個(gè)標(biāo)識(shí)符綁定某個(gè)服務(wù),并為之分配資源。這個(gè)標(biāo)識(shí)就是該插口標(biāo)識(shí)。 應(yīng)用程序調(diào)用socket()函數(shù)將創(chuàng)建一個(gè)插口。 2、原型,8.2.2 本地地址綁定bind() 1、功能 調(diào)用函數(shù)bind(),可以將本地地址與插口綁定在一起。調(diào)用成功時(shí),返回0;否則,返回1,并設(shè)置全局變量errno為錯(cuò)誤類型 2、原型,參數(shù)說明 sockfd是函數(shù)socket返回的插口描述字; myaddr是特定于協(xié)議的地址結(jié)構(gòu)體的指針,指向本地插口地址; addrlen是插口地址結(jié)構(gòu)體的長(zhǎng)度。,8.2.3 建立套接口連接綁定遠(yuǎn)程服務(wù)器地址connect() 功能 函數(shù)connect()可以讓客戶機(jī)程序建立一個(gè)與TCP服務(wù)器的連接. 原型,參數(shù): sockfd是函數(shù)socket返回的插口描述符; servaddr指定遠(yuǎn)程服務(wù)器的插口地址; addrlen是插口地址結(jié)構(gòu)體的長(zhǎng)度。,8.2.4 套接口被動(dòng)轉(zhuǎn)換listen() 函數(shù)listen()有兩個(gè)功能。 (1)主動(dòng)插口的被動(dòng)轉(zhuǎn)換 socket()創(chuàng)建的插口都是主動(dòng)插口,只可以用來(調(diào)用connect())進(jìn)行主動(dòng)連接(發(fā)出請(qǐng)求),不能接收連接請(qǐng)求。listen()函數(shù)將未連接的主動(dòng)插口轉(zhuǎn)換為被動(dòng)插口,即傾聽插口(listening socket),告訴操作系統(tǒng)該插口可以接收連接請(qǐng)求。所以listen()也稱為創(chuàng)建傾聽插口函數(shù)。 (2)設(shè)置最大請(qǐng)求連接數(shù) listen()用一個(gè)參數(shù)(backlog)指定完成隊(duì)列的最大長(zhǎng)度。如果一個(gè)客戶機(jī)的SYN數(shù)據(jù)段到達(dá)時(shí),傾聽插口的完成隊(duì)列已經(jīng)滿了,TCP則忽略這個(gè)SYN數(shù)據(jù)段。 listen()函數(shù)執(zhí)行成功,返回0,服務(wù)器的TCP狀態(tài)由CLOSED轉(zhuǎn)變成LISTEN,成為被動(dòng)模式;執(zhí)行失敗,返回1。 原型,參數(shù): sockfd為要轉(zhuǎn)換的已綁定本地地址的插口描述符; backlog設(shè)置請(qǐng)求隊(duì)列的最大長(zhǎng)度,表示被動(dòng)(傾聽)插口能夠接收的最大數(shù)目的未接收連接(相當(dāng)于窗口通告)。,8.2.4 套接口被動(dòng)轉(zhuǎn)換listen(),創(chuàng)建TCP服務(wù)器傾聽插口的過程 (1)首先調(diào)用socket()函數(shù)創(chuàng)建一個(gè)主動(dòng)插口; (2)調(diào)用bind()函數(shù)進(jìn)行插口地址綁定; (3)調(diào)用listen()函數(shù)進(jìn)行轉(zhuǎn)換。,8.2.5 從被動(dòng)套接口的完成隊(duì)列中接受一個(gè)連接請(qǐng)求accept() 功能 一個(gè)插口被創(chuàng)建、用bind綁定本地地址并轉(zhuǎn)換成被動(dòng)模式后,必須接收一個(gè)連接請(qǐng)求。一旦接收了連接,服務(wù)器就能使用該連接與客戶機(jī)進(jìn)行通信。面向連接傳輸協(xié)議的服務(wù)器調(diào)用 accept從被動(dòng)(傾聽)插口的完成連接隊(duì)列中接收下一個(gè)連接請(qǐng)求。如果該完成連接隊(duì)列空,則使這個(gè)進(jìn)程睡眠。 原型,參數(shù): sockfd為服務(wù)器已經(jīng)創(chuàng)建并綁定到指定插口地址的插口描述符; addr是指向一個(gè)Internet插口地址結(jié)構(gòu)體的指針; addrlen是指向一個(gè)整型數(shù)的指針。,8.2.5 從被動(dòng)套接口的完成隊(duì)列中接受一個(gè)連接請(qǐng)求accept(),accept()工作過程 TCP使用偵聽插口接收客戶機(jī)的連接請(qǐng)求。如果調(diào)用accept()時(shí),傾聽插口的完成隊(duì)列中有已經(jīng)完成3次握手的TCP連接,accept()就從隊(duì)列的首部讀取第一個(gè)連接,并返回該連接的描述符。如果調(diào)用accept()時(shí),傾聽插口的完成隊(duì)列為空,進(jìn)程將阻塞,等待出現(xiàn)新的完成3次握手的TCP連接送到完成隊(duì)列;TCP協(xié)議為服務(wù)器創(chuàng)建一個(gè)新的連接插口來標(biāo)識(shí)這條新的連接,accept()返回該新連接的描述符。,8.2.6 基本套接口I/O函數(shù)列表,8.2.7 關(guān)閉插口通道與撤消套接口 1、概述 建立一對(duì)插口的連接之后,就可以進(jìn)行通信了。由于TCP連接是全雙工的,對(duì)每一個(gè)套接口來說,都可以看作在使用讀、寫兩個(gè)通道進(jìn)行通信。于是,關(guān)閉一個(gè)插口通信可以有兩種不同級(jí)別的方法。 (1)關(guān)閉插口通道,具體有三種方式: SHUT_RD關(guān)閉連接的讀通道; SHUT_WR關(guān)閉連接的寫通道; SHUT_RDWR關(guān)閉連接的讀寫通道。 (2)撤消套接口(句柄),同時(shí)關(guān)閉了連接的讀寫通道。 這兩種方式分別用兩個(gè)不同的函數(shù)shutdown()和close()實(shí)現(xiàn)。 2. close()原型 函數(shù)close()用于撤消一個(gè)插口,終止其TCP連接,其原型為 #include in close (int sockfd) 3. shutdown()原型 #include int shutdown (int sockfd, int howto);,8.3 基于TCP的socket程序設(shè)計(jì),8.3.1 TCP有限狀態(tài)機(jī) 1、TCP有限狀態(tài)機(jī)的概念 在網(wǎng)絡(luò)通信中,一個(gè)健壯的插口應(yīng)用程序必須能夠處理通信過程中可能出現(xiàn)的各種狀態(tài)。對(duì)于TCP來說,不同的狀態(tài)將決定傳輸實(shí)體對(duì)一些事件的響應(yīng)。描述TCP在響應(yīng)各種事件時(shí),各個(gè)宏觀狀態(tài)之間相互作用的規(guī)則稱為TCP有限狀態(tài)機(jī)(或稱TCP狀態(tài)轉(zhuǎn)換圖),它由圖所示的11種狀態(tài)組成。,TCP的有限狀態(tài)機(jī),2、狀態(tài)轉(zhuǎn)換分析 (1) 客戶進(jìn)程發(fā)起連接的狀態(tài)轉(zhuǎn)換過程 一個(gè)主機(jī)的客戶進(jìn)程要發(fā)起連接,其TCP實(shí)體就發(fā)一個(gè)SYN置1的分組 由CLOSED狀態(tài)進(jìn)入SYN_SENT狀態(tài)。 收到來自進(jìn)程的SYN和ACK,TCP就發(fā)出三次握手中的最后一個(gè)ACK 進(jìn)入ESTABLISHED狀態(tài)。這時(shí)就可以收發(fā)數(shù)據(jù)了。 (2) 客戶進(jìn)程發(fā)起斷連請(qǐng)求(主動(dòng)關(guān)閉)的狀態(tài)轉(zhuǎn)換過程 客戶進(jìn)程要發(fā)起斷連,其TCP實(shí)體就發(fā)一個(gè)SYN置1的分組,等待確認(rèn)ACK的到達(dá) 由ESTABLISHED狀態(tài)變?yōu)镕IN_WAIT_1狀態(tài)。 運(yùn)行客戶進(jìn)程的主機(jī)收到確認(rèn)ACK,一個(gè)方向的連接關(guān)閉 進(jìn)入FIN_WAIT_2狀態(tài)。 運(yùn)行客戶進(jìn)程的主機(jī)收到運(yùn)行服務(wù)器的主機(jī)發(fā)送的FIN置1的分組后,應(yīng)響應(yīng)確認(rèn)ACK。 收到確認(rèn)ACK,連接不是立即進(jìn)入到關(guān)閉CLOSED,而是先進(jìn)入TIME_WAIT狀態(tài)。 TCP在TIME_WAIT狀態(tài)等待2MSL(MSL表示分組在網(wǎng)絡(luò)中的壽命),才刪除原來建立的連接記錄 返回CLOSED狀態(tài)。,8.3.2 TCP的C/S模型時(shí)序圖 面向連接的C/S模型的典型時(shí)序圖說明:服務(wù)器必須首先啟動(dòng),直到它執(zhí)行accept()調(diào)用,進(jìn)入等待狀態(tài),方可接收客戶機(jī)請(qǐng)求。否則,客戶機(jī)的connect()調(diào)用將返回出錯(cuò)代碼,連接宣告失敗。,面向連接的C/S模型的典型時(shí)序圖,面向連接服務(wù)器處理的請(qǐng)求C/S模型工作過程: 服務(wù)進(jìn)程首先調(diào)用socket( )創(chuàng)建一個(gè)字節(jié)流套接字,并調(diào)用bind( )將服務(wù)器地址捆扎在該套接字上,接著調(diào)用listen( )監(jiān)聽連接請(qǐng)求,隨后調(diào)用accept( )做好與客戶進(jìn)程建立連接的準(zhǔn)備,無連接請(qǐng)求時(shí),服務(wù)進(jìn)程被阻塞。當(dāng)連接請(qǐng)求到來后,服務(wù)器進(jìn)程被喚醒,建立一個(gè)新的Socket,并用新套接字同客戶進(jìn)程的套接字建立連接,而服務(wù)進(jìn)程最早生成的套接字則繼續(xù)用于監(jiān)聽網(wǎng)絡(luò)上的服務(wù)請(qǐng)求。 客戶進(jìn)程調(diào)用socket( )創(chuàng)建字節(jié)流套接字,然后調(diào)用connect( )向服務(wù)進(jìn)程發(fā)出連接請(qǐng)求。 服務(wù)進(jìn)程和客戶進(jìn)程通過調(diào)用read( )/recv( )和Write( )/send( )交換數(shù)據(jù)。,8.4 基于UDP的socket 程序設(shè)計(jì),8.4.1 UDP編程模式 UDP提供不保證順序的用戶數(shù)據(jù)報(bào)傳輸服務(wù)。在比較簡(jiǎn)單的應(yīng)用中,客戶機(jī)常常只用單個(gè)UDP報(bào)文來發(fā)送請(qǐng)求,服務(wù)器也用單個(gè)報(bào)文回送應(yīng)答。這種情況下,UDP服務(wù)器和客戶機(jī)間的交互程序采用循環(huán)結(jié)構(gòu)是非常有利的。圖表明了這種處理結(jié)構(gòu)。,圖 采用循環(huán)結(jié)構(gòu)的UDP服務(wù)器與客戶機(jī)間的交互,8.5 輸入輸出多路復(fù)用,輸入輸出多路復(fù)用基本工作原理: 輸入輸出多路復(fù)用是一種特殊的阻塞式輸入輸出模式,其特點(diǎn):用select()調(diào)用指示內(nèi)核

溫馨提示

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