網(wǎng)絡(luò)編程第2講Socket網(wǎng)絡(luò)編程基礎(chǔ).ppt_第1頁
網(wǎng)絡(luò)編程第2講Socket網(wǎng)絡(luò)編程基礎(chǔ).ppt_第2頁
網(wǎng)絡(luò)編程第2講Socket網(wǎng)絡(luò)編程基礎(chǔ).ppt_第3頁
網(wǎng)絡(luò)編程第2講Socket網(wǎng)絡(luò)編程基礎(chǔ).ppt_第4頁
網(wǎng)絡(luò)編程第2講Socket網(wǎng)絡(luò)編程基礎(chǔ).ppt_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第2講 Socket網(wǎng)絡(luò)編程基礎(chǔ),套接字網(wǎng)絡(luò)編程接口的產(chǎn)生與發(fā)展過程 套接字編程的基本概念 套接字的特點、應(yīng)用場合、使用的數(shù)據(jù)類型 面向連接的套接字編程 套接字的工作過程、系統(tǒng)調(diào)用、編程實例 借助實例分析進程的阻塞問題和對策 無連接的套接字編程 無連接套接字編程的兩種模式(C/S和對等) 數(shù)據(jù)報套接字的對等模式編程實例,2.1 套接字網(wǎng)絡(luò)編程接口的產(chǎn)生與發(fā)展,2.1.1 問題的提出 應(yīng)用程序與協(xié)議軟件進行交互時須說明許多細(xì)節(jié): 是服務(wù)器還是客戶機,主動還是被動通信? 發(fā)送方需說明發(fā)送的數(shù)據(jù); 接收方需說明接收的數(shù)據(jù)如何存放。 站在應(yīng)用程序?qū)崿F(xiàn)的角度,應(yīng)用程序如何方便地使用協(xié)議棧軟件進行通信呢?

2、 如果能在應(yīng)用程序與協(xié)議棧軟件之間提供一個軟件接口,就可以方便客戶與服務(wù)器軟件的編程。 UNIX最早將TCP/IP協(xié)議簇集成到內(nèi)核中,UNIX的開發(fā)者提出并實現(xiàn)了套接字應(yīng)用編程接口。,套接字應(yīng)用程序編程接口:是網(wǎng)絡(luò)應(yīng)用程序通過網(wǎng)絡(luò)協(xié)議棧進行通信時所使用的接口,即應(yīng)用程序與協(xié)議棧軟件之間的接口,簡稱套接字編程接口(Socket API)。 定義了應(yīng)用程序與協(xié)議棧軟件進行交互時可以使用的一組操作,決定了應(yīng)用程序使用協(xié)議棧的方式、應(yīng)用程序所能實現(xiàn)的功能、以及開發(fā)具有這些功能的程序的難度。 套接字編程接口給出了應(yīng)用程序能夠調(diào)用的一組過程,以及這些過程所需的參數(shù),每個獨立的過程完成一個與協(xié)議棧軟件交互的

3、基本操作(如:建立連接、接收數(shù)據(jù)、釋放鏈接)。,2.1.2 套接字編程接口的起源與應(yīng)用 加州大學(xué)伯克利分校開發(fā)了一個包括TCP/IP協(xié)議簇的BSD UNIX,并迅速得到推廣,套接字編程接口是這個操作系統(tǒng)一部分。 TCP/IP標(biāo)準(zhǔn)并沒有定義應(yīng)用程序用來與該協(xié)議進行交互的應(yīng)用程序編程接口,只規(guī)定了應(yīng)該提供的一般操作,并允許各個操作系統(tǒng)去定義用來實現(xiàn)這些操作的具體API。 一個協(xié)議標(biāo)準(zhǔn)可能只是建議某個操作在應(yīng)用程序發(fā)送數(shù)據(jù)時是需要的,而由應(yīng)用程序編程接口來定義具體的函數(shù)名和每個參數(shù)的類型。,盡管協(xié)議標(biāo)準(zhǔn)允許操作系統(tǒng)設(shè)計者開發(fā)自己的應(yīng)用程序編程接口,但由于BSD UNIX的廣泛使用,后來的許多操作系統(tǒng)

4、及編程語言都選擇了對套接字編程接口的支持。 由于這個套接字規(guī)范最早是由Berkeley大學(xué)開發(fā)的,一般將它稱為Berkeley Sockets規(guī)范。 Berkeley Sockets規(guī)范規(guī)定了一系列與套接字使用有關(guān)的庫函數(shù),為在UNIX操作系統(tǒng)下不同計算機中的應(yīng)用程序進程之間,使用TCP/IP協(xié)議簇進行網(wǎng)絡(luò)通信提供了一套應(yīng)用程序編程接口。,2.1.3 套接字編程接口的兩種實現(xiàn)方式 采用兩種實現(xiàn)套接字編程接口的方式: 在操作系統(tǒng)的內(nèi)核中增加相應(yīng)的軟件來實現(xiàn); 通過開發(fā)操作系統(tǒng)之外的函數(shù)庫來實現(xiàn)。 在BSD UNIX及起源于它的操作系統(tǒng)中,套接字函數(shù)是操作系統(tǒng)本身的功能調(diào)用,是操作系統(tǒng)內(nèi)核的一部分

5、。 其他操作系統(tǒng)供應(yīng)商為了不修改基本操作系統(tǒng),開發(fā)了套接字庫(Socket Library)來提供套接字編程接口。 套接字庫中的每個過程具有與UNIX套接字函數(shù)相同的名字與參數(shù),向沒有本機套接字的操作系統(tǒng)上的應(yīng)用程序提供套接字編程接口。,套接字庫與操作系統(tǒng)內(nèi)核中實現(xiàn)的套接字在語義上是相同的。 應(yīng)用程序調(diào)用套接字過程不必管它是由操作系統(tǒng)內(nèi)核過程提供的,還是由庫過程提供的。 這種方式提供了程序的可移植性:將程序從一臺計算機移植到另一臺計算機時,程序的源代碼不需改動,只要用新計算機上的套接字庫重新編譯即可。 套接字庫與操作系統(tǒng)直接提供的本機套接字編程接口在實現(xiàn)上是不同的。 套接字庫的過程需要鏈接到應(yīng)

6、用程序中; 并駐留于應(yīng)用程序地址空間; 調(diào)用時控制從應(yīng)用程序轉(zhuǎn)向庫程序,并進一步調(diào)用一個或多個底層操作系統(tǒng)的功能調(diào)用。,2.2 套接字編程的基本概念,圖2.1 電插座與電話插座的作用,2.2.1 什么是套接字(SOCKET),套接字是對網(wǎng)絡(luò)中不同主機上應(yīng)用進程之間進行雙向通信的端點的抽象。 一個套接字就是網(wǎng)絡(luò)上進程通信的一端,提供了應(yīng)用層進程利用網(wǎng)絡(luò)協(xié)議棧交換數(shù)據(jù)的機制。,圖2.2 應(yīng)用進程、套接口、網(wǎng)絡(luò)協(xié)議棧及操作系統(tǒng)的關(guān)系,兩個應(yīng)用進程只要分別連接到自己的套接字,就可以通過網(wǎng)絡(luò)痛惜,不用去管復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)及數(shù)據(jù)傳輸過程。,從多個層面來理解套接字這個概念的內(nèi)涵 從所處的地位來講,套接字上聯(lián)應(yīng)

7、用進程,下聯(lián)網(wǎng)絡(luò)協(xié)議棧,是應(yīng)用程序通過網(wǎng)絡(luò)協(xié)議棧進行通信的接口,是應(yīng)用程序與網(wǎng)絡(luò)協(xié)議棧交互的接口. 從實現(xiàn)的角度來講,非常復(fù)雜。套接字是一個復(fù)雜的軟件機構(gòu),包含了一定的數(shù)據(jù)結(jié)構(gòu),包含許多選項,由操作系統(tǒng)內(nèi)核管理。 從使用的角度來講,非常簡單。對套接字的操作形成了一種網(wǎng)絡(luò)應(yīng)用程序的編程接口(API),提供了一組系統(tǒng)調(diào)用或庫函數(shù),可以用于構(gòu)造套接字、安裝綁定套接字、連接套接字、通過套接字交換數(shù)據(jù)、關(guān)閉套接字,實現(xiàn)各種分布式應(yīng)用。 套接字編程接口是一套操作套接字的編程接口函數(shù),套接字是它的操作對象。,2.2.2 套接字的特點 1通信域 通信域:是一個計算機網(wǎng)絡(luò)的范圍,在這個范圍中,所有的計算機使用同

8、一種網(wǎng)絡(luò)體系結(jié)構(gòu)及協(xié)議棧。 套接字存在于通信域中。 套接字通常只和同一域中的套接字交換數(shù)據(jù)。 如果數(shù)據(jù)交換要穿越域的邊界,就一定要執(zhí)行某種解釋程序。 這里,僅僅針對Internet域,并且使用Internet協(xié)議族(即TCP/IP協(xié)議族)來通信。,2套接字具有三種類型 每一個正被使用的套接字都有它確定的類型。 只有相同類型的套接字才能相互通信。 (1) 數(shù)據(jù)報套接字(Datagram SOCKET) 數(shù)據(jù)報套接字提供無連接的、不保證可靠的、獨立的數(shù)據(jù)報傳輸服務(wù)。 在Internet通信域中,數(shù)據(jù)報套接字使用UDP數(shù)據(jù)報協(xié)議形成的進程間通路,具有UDP協(xié)議為上層所提供的服務(wù)的所有特點。 一般用于

9、輕載通信,并具有多播通信的能力。,圖2.3 在Internet通信域中,數(shù)據(jù)報套接字基于UDP協(xié)議,(2) 流式套接字(Stream SOCKET) 流式套接字提供雙向的、有序的、無重復(fù)的、無記錄邊界的可靠的數(shù)據(jù)流傳輸服務(wù)。 在Internet通信域中,流式套接字使用TCP協(xié)議形成的進程間通路,具有TCP協(xié)議為上層所提供的服務(wù)的所有特點。 在使用流式套接字傳輸數(shù)據(jù)之前,必須在數(shù)據(jù)的發(fā)送端和接收端之間建立連接。 一般用于交換大批量的數(shù)據(jù)時,或者要求數(shù)據(jù)按照發(fā)送的順序無重復(fù)的到達(dá)目的地的時候。,圖2.4 在Internet通信域中,流式套接字基于TCP協(xié)議,(3) 原始式套接字(RAW SOCKE

10、T) 原始式套接字允許對較低層次的協(xié)議(如IP、ICMP)直接訪問,用于檢驗新協(xié)議的實現(xiàn)。 原始套接字保存了數(shù)據(jù)包中的完整IP頭; 前面兩種套接字只能收到用戶數(shù)據(jù); 因此可以通過原始套接字對數(shù)據(jù)進行分析。,2.2.3 套接字的應(yīng)用場合 并非所有的網(wǎng)絡(luò)應(yīng)用編程都要使用套接字。 套接字適合開發(fā)具有如下特點的新網(wǎng)絡(luò)應(yīng)用。 不管是采用對等模式或者客戶機/服務(wù)器模式,通信雙方的應(yīng)用程序都需要開發(fā)。 雙方所交換數(shù)據(jù)的結(jié)構(gòu)和交換數(shù)據(jù)的順序有特定的要求,不符合現(xiàn)在成熟的應(yīng)用層協(xié)議,甚至需要自己去開發(fā)應(yīng)用層協(xié)議,自己設(shè)計最適合的數(shù)據(jù)結(jié)構(gòu)和信息交換規(guī)程。 套接字編程層次較低,自由度較大。,2.3 面向連接的套接字

11、編程,2.3.1 套接字的工作過程 面向連接的通信方式基于TCP,必須借助流式套接字來編程,應(yīng)用服務(wù)器分為服務(wù)器端和客戶端,雙方是不對稱的,需要分別編程。 雙方首先要創(chuàng)建并安裝套接字,做好準(zhǔn)備; 建立連接,采用三次握手的方式; 數(shù)據(jù)交換,稱為客戶機與服務(wù)器的會話期,會話的內(nèi)容必須遵守一定的格式和順序; 釋放連接。 下面介紹面向連接的服務(wù)器和客戶端的編程步驟.,2.3.2 套接字編程接口的系統(tǒng)調(diào)用 1創(chuàng)建套接字SOCKET() 創(chuàng)建一個套接字,并返回一個整型描述符: int SOCKET( int Protofamily, int Type, int Protocol); 入口參數(shù): Proto

12、family:套接字使用的協(xié)議簇,一般為PF_INET,表示TCP/IP協(xié)議簇,PF_DECnet表示DEC協(xié)議。 type:套接字類型,SOCK_STREMA表示創(chuàng)建面向連接的流傳輸?shù)牧魇教捉幼?;SOCK_DGRAMA表示創(chuàng)建無連接的面向消息的數(shù)據(jù)報套接字。 protocol:套接字使用的傳輸層網(wǎng)絡(luò)協(xié)議,一般為IPPROTO_IP,internet通信域中一般取值為0。,返回值: 套接字創(chuàng)建成功,返回一個int型的整數(shù),即所創(chuàng)建套接字的描述符,指向被維護在操作系統(tǒng)內(nèi)核里的socket數(shù)據(jù)結(jié)構(gòu)。 套接字創(chuàng)建出錯,返回1,表示出錯類型的代碼保存在全局變量Errno中。 舉例: int sockf

13、d=SOCKET(PF_INTE,SOCK_STREAM,0) 創(chuàng)建套接字時,為其分配了內(nèi)存,并建立了相應(yīng)的數(shù)據(jù)結(jié)構(gòu),用于指定連接的種類和使用的協(xié)議,同時還有關(guān)于連接隊列操作的選項結(jié)構(gòu)字段,創(chuàng)建時設(shè)置為默認(rèn)值。,2綁定套接字到指定的地址 BIND() int BIND( int Sockfd, struct sockaddr* My_addr, int Addrlen); 入口參數(shù): Sockfd:是由SOCKET()系統(tǒng)調(diào)用創(chuàng)建的套接字描述符,要將其綁定到指定的網(wǎng)絡(luò)地址上; My_addr:指向sockaddr結(jié)構(gòu)變量的指針,所指結(jié)構(gòu)中保存著特定的網(wǎng)絡(luò)地址,要將套接字綁定到這個網(wǎng)絡(luò)地址上;

14、Addlen:是sockaddr結(jié)構(gòu)的長度。,返回值: 如果返回0,表示已經(jīng)綁定成功。 如果返回1,表示有錯,出錯碼在Errno中。 舉例: Struct sockaddr_in my_addr; if( BIND(sockfd, (sockaddr*) 入口參數(shù): Sockfd:套接字描述符,通過它來監(jiān)聽來自客戶機端的連接請求。 Queuesize:等待連接隊列的最大長度,最大可設(shè)為20,一般設(shè)為510。 返回值: 函數(shù)正確執(zhí)行則返回0,出錯則返回-1。 舉例:LISTEN(Sockfe,10);,舉例:LISTEN(Sockfe, 10);,圖2.6 監(jiān)聽套接字使用緩沖區(qū)接納多個客戶端的連

15、接請求,4接收連接請求ACCEPT() int ACCEPT(int Sockfd, struct sockaddr* Addr, int* addrlen); 入口參數(shù): Sockfd:監(jiān)聽客戶端連接請求的套接字描述符。 Addr:sockaddr結(jié)構(gòu)變量的指針,是一個出口參數(shù),當(dāng)調(diào)用執(zhí)行完畢時,變量中放置的是所接收客戶機端的網(wǎng)絡(luò)地址。 Addrlen:整型變量指針,也是一個出口參數(shù),調(diào)用時初始設(shè)置為Addr結(jié)構(gòu)的長度,不能為0或null,調(diào)用執(zhí)行完畢時,返回所接收的客戶機端網(wǎng)絡(luò)地址長度。,返回值: 如果執(zhí)行正確,返回一個新的套接字描述符,這個套接字已經(jīng)與客戶機端建立了連接,并專用于此后與客

16、戶機端交換數(shù)據(jù)。 如果出錯,返回1。 說明: 調(diào)用從監(jiān)聽套接字的等待隊列中,取出第一個連接請求,創(chuàng)建一個新的套接字,并通過這個新套接字向客戶機端發(fā)送連接應(yīng)答,從而與客戶機端建立連接,系統(tǒng)為這個新的套接字分配一個服務(wù)器端的自由端口號,這個套接字用于后續(xù)與客戶機端交換數(shù)據(jù),稱為響應(yīng)套接字。,舉例: int clientfd; / 定義響應(yīng)套接字描述符變量 int addrler=sizeof(sockaddr); / 獲得套接字地址結(jié)構(gòu)長度。 struct sockaddr_in cltsockaddr; / 定義用于返回客戶端地址的結(jié)構(gòu)。 clientfd=ACCEPT(listenfd, (s

17、ockaddr* )( / 接收客戶連接請求,5請求建立連接CONNECT() int CONNECT( int Sockfd, struct sockaddr* Service_addr, int Addrlen); 入口參數(shù): Sockfd:客戶機端的請求套接字; Service_addr:存放服務(wù)器端的網(wǎng)絡(luò)地址; Addrlen:sockaddr結(jié)構(gòu)的長度。 返回值: 連接成功,返回0; 連接未成功,返回-1。,說明: 用于客戶端請求連接到服務(wù)器; 對于流式套接字,使用TCP協(xié)議,服務(wù)器若接受連接請求,即把它放入監(jiān)聽套接字的緩沖區(qū)隊列,并調(diào)用ACCEPT()來接收處理; 對于數(shù)據(jù)報套接字

18、,使用UDP協(xié)議,客戶機向同一服務(wù)器傳送多條信息時,允許客戶機使用CONNECT只指明服務(wù)器地址一次,而不必在每條信息中都指明目的地址。 舉例:if ( CONNECT(sockfd, (struct sockaddr*)( int RECV( int sockfd, char* buf, int len, int flags ); 入口參數(shù): sockfd:用來發(fā)送/接收數(shù)據(jù)的套接字描述符,可以是由SOCKET()創(chuàng)建的,也可以是ACCEPT()返回的; buf:用于發(fā)送/接收數(shù)據(jù)的緩沖區(qū)指針; len:發(fā)送或接收的字符數(shù); flags:執(zhí)行本調(diào)用的方式,一般置為0.,返回值: 處理錯誤,返

19、回-1; 如果正確,對于發(fā)送返回實際發(fā)送出去的字節(jié)數(shù);對于接收返回實際讀入緩沖區(qū)的字節(jié)數(shù)。 說明: 和read、write一樣,必須用于已連接的套接字,無需調(diào)用者指明目的地參數(shù)。,8關(guān)閉套接字CLOSE() int CLOSE( int sockfd ); 入口參數(shù): sockfd:要關(guān)閉的套接字描述符。 說明: 如果是面向連接的,CLOSE在關(guān)閉套接字前先終止連接; 關(guān)閉一個套接字意味著立即終止對它的使用,描述符被釋放,以防止應(yīng)用程序發(fā)送或接收更多的數(shù)據(jù)。,關(guān)于阻塞的問題,圖2.7 服務(wù)器進程因調(diào)用ACCEPT()而被阻塞,2.3.4 進程的阻塞問題和對策 1什么是阻塞 阻塞:是指一個進程執(zhí)

20、行了一個函數(shù)或者系統(tǒng)調(diào)用,該函數(shù)由于某種原因不能立即完成,因而不能返回調(diào)用它的進程,導(dǎo)致進程受控于這個函數(shù)而處于等待的狀態(tài),進程的這種狀態(tài)稱為阻塞。,圖2.8 RECV()函數(shù)的兩種執(zhí)行方式,2能引起阻塞的套接字調(diào)用 在Berkeley套接字網(wǎng)絡(luò)編程接口的模型中,套接字的默認(rèn)行為是阻塞的,具體地說,在一定情況下,有多個操作套接字的系統(tǒng)調(diào)用會引起進程阻塞。 (1)ACCEPT() (2)READ()、RECV()和READFORM() (3)WRITE()、SEND()和SENDTO() (4)CONNECT() (5)SELECT() (6)CLOSESOCKET(),圖2.9 采用阻塞工作模

21、式的服務(wù)器不能很好地為多個客戶服務(wù),3阻塞工作模式帶來的問題 采用阻塞工作模式的單進程服務(wù)器,不能很好地同時為多個客戶服務(wù)的。圖2.9是一個例子。,2.4 無連接的套接字編程,2.4.1 無連接的套接字編程的兩種模式 使用數(shù)據(jù)報套接字開發(fā)網(wǎng)絡(luò)應(yīng)用程序,既可以采用客戶/服務(wù)器模式,也可以采用對等模式。,圖2.10 對等模式的數(shù)據(jù)報套接字的編程模型,1對等模式,對等模式無連接套接字特點: 應(yīng)用雙方是對等的:要經(jīng)過4個階段,創(chuàng)建套接字、綁定套接字、發(fā)送/接收數(shù)據(jù)、關(guān)閉套接字; 雙方都必須確切知道對方的網(wǎng)絡(luò)地址,并在各自的進程中將約定好的網(wǎng)絡(luò)地址綁定到自己的套接字上; 每一次傳遞數(shù)據(jù)時,在sendto和recvfrom系統(tǒng)調(diào)用中必須包含對方的網(wǎng)絡(luò)地址信息; 進程也會因為發(fā)送或接收數(shù)據(jù)而發(fā)生阻塞。,2客戶/服務(wù)器模式,圖2.11 C/S模式的數(shù)據(jù)報套接字的編程模型,C/S模式無連接套接字特點: 應(yīng)用雙方不是對等的:服務(wù)器要先啟動,被動

溫馨提示

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

評論

0/150

提交評論