資源描述:
《網(wǎng)絡(luò)編程第2講Socket網(wǎng)絡(luò)編程基礎(chǔ)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、第2講Socket網(wǎng)絡(luò)編程基礎(chǔ)套接字網(wǎng)絡(luò)編程接口的產(chǎn)生與發(fā)展過(guò)程套接字編程的基本概念套接字的特點(diǎn)、應(yīng)用場(chǎng)合、使用的數(shù)據(jù)類型面向連接的套接字編程套接字的工作過(guò)程、系統(tǒng)調(diào)用、編程實(shí)例借助實(shí)例分析進(jìn)程的阻塞問(wèn)題和對(duì)策無(wú)連接的套接字編程無(wú)連接套接字編程的兩種模式(C/S和對(duì)等)數(shù)據(jù)報(bào)套接字的對(duì)等模式編程實(shí)例2.1套接字網(wǎng)絡(luò)編程接口的產(chǎn)生與發(fā)展2.1.1問(wèn)題的提出應(yīng)用程序與協(xié)議軟件進(jìn)行交互時(shí)須說(shuō)明許多細(xì)節(jié):是服務(wù)器還是客戶機(jī),主動(dòng)還是被動(dòng)通信?發(fā)送方需說(shuō)明發(fā)送的數(shù)據(jù);接收方需說(shuō)明接收的數(shù)據(jù)如何存放。站在應(yīng)用程序?qū)崿F(xiàn)的角度,應(yīng)用程序如何方便地使用協(xié)
2、議棧軟件進(jìn)行通信呢?如果能在應(yīng)用程序與協(xié)議棧軟件之間提供一個(gè)軟件接口,就可以方便客戶與服務(wù)器軟件的編程。UNIX最早將TCP/IP協(xié)議簇集成到內(nèi)核中,UNIX的開(kāi)發(fā)者提出并實(shí)現(xiàn)了套接字應(yīng)用編程接口。套接字應(yīng)用程序編程接口:是網(wǎng)絡(luò)應(yīng)用程序通過(guò)網(wǎng)絡(luò)協(xié)議棧進(jìn)行通信時(shí)所使用的接口,即應(yīng)用程序與協(xié)議棧軟件之間的接口,簡(jiǎn)稱套接字編程接口(SocketAPI)。定義了應(yīng)用程序與協(xié)議棧軟件進(jìn)行交互時(shí)可以使用的一組操作,決定了應(yīng)用程序使用協(xié)議棧的方式、應(yīng)用程序所能實(shí)現(xiàn)的功能、以及開(kāi)發(fā)具有這些功能的程序的難度。套接字編程接口給出了應(yīng)用程序能夠調(diào)用的一組過(guò)程
3、,以及這些過(guò)程所需的參數(shù),每個(gè)獨(dú)立的過(guò)程完成一個(gè)與協(xié)議棧軟件交互的基本操作(如:建立連接、接收數(shù)據(jù)、釋放鏈接)。2.1.2套接字編程接口的起源與應(yīng)用加州大學(xué)伯克利分校開(kāi)發(fā)了一個(gè)包括TCP/IP協(xié)議簇的BSDUNIX,并迅速得到推廣,套接字編程接口是這個(gè)操作系統(tǒng)一部分。TCP/IP標(biāo)準(zhǔn)并沒(méi)有定義應(yīng)用程序用來(lái)與該協(xié)議進(jìn)行交互的應(yīng)用程序編程接口,只規(guī)定了應(yīng)該提供的一般操作,并允許各個(gè)操作系統(tǒng)去定義用來(lái)實(shí)現(xiàn)這些操作的具體API。一個(gè)協(xié)議標(biāo)準(zhǔn)可能只是建議某個(gè)操作在應(yīng)用程序發(fā)送數(shù)據(jù)時(shí)是需要的,而由應(yīng)用程序編程接口來(lái)定義具體的函數(shù)名和每個(gè)參數(shù)的類型。
4、盡管協(xié)議標(biāo)準(zhǔn)允許操作系統(tǒng)設(shè)計(jì)者開(kāi)發(fā)自己的應(yīng)用程序編程接口,但由于BSDUNIX的廣泛使用,后來(lái)的許多操作系統(tǒng)及編程語(yǔ)言都選擇了對(duì)套接字編程接口的支持。由于這個(gè)套接字規(guī)范最早是由Berkeley大學(xué)開(kāi)發(fā)的,一般將它稱為BerkeleySockets規(guī)范。BerkeleySockets規(guī)范規(guī)定了一系列與套接字使用有關(guān)的庫(kù)函數(shù),為在UNIX操作系統(tǒng)下不同計(jì)算機(jī)中的應(yīng)用程序進(jìn)程之間,使用TCP/IP協(xié)議簇進(jìn)行網(wǎng)絡(luò)通信提供了一套應(yīng)用程序編程接口。2.1.3套接字編程接口的兩種實(shí)現(xiàn)方式采用兩種實(shí)現(xiàn)套接字編程接口的方式:在操作系統(tǒng)的內(nèi)核中增加相應(yīng)的軟
5、件來(lái)實(shí)現(xiàn);通過(guò)開(kāi)發(fā)操作系統(tǒng)之外的函數(shù)庫(kù)來(lái)實(shí)現(xiàn)。在BSDUNIX及起源于它的操作系統(tǒng)中,套接字函數(shù)是操作系統(tǒng)本身的功能調(diào)用,是操作系統(tǒng)內(nèi)核的一部分。其他操作系統(tǒng)供應(yīng)商為了不修改基本操作系統(tǒng),開(kāi)發(fā)了套接字庫(kù)(SocketLibrary)來(lái)提供套接字編程接口。套接字庫(kù)中的每個(gè)過(guò)程具有與UNIX套接字函數(shù)相同的名字與參數(shù),向沒(méi)有本機(jī)套接字的操作系統(tǒng)上的應(yīng)用程序提供套接字編程接口。套接字庫(kù)與操作系統(tǒng)內(nèi)核中實(shí)現(xiàn)的套接字在語(yǔ)義上是相同的。應(yīng)用程序調(diào)用套接字過(guò)程不必管它是由操作系統(tǒng)內(nèi)核過(guò)程提供的,還是由庫(kù)過(guò)程提供的。這種方式提供了程序的可移植性:將程序
6、從一臺(tái)計(jì)算機(jī)移植到另一臺(tái)計(jì)算機(jī)時(shí),程序的源代碼不需改動(dòng),只要用新計(jì)算機(jī)上的套接字庫(kù)重新編譯即可。套接字庫(kù)與操作系統(tǒng)直接提供的本機(jī)套接字編程接口在實(shí)現(xiàn)上是不同的。套接字庫(kù)的過(guò)程需要鏈接到應(yīng)用程序中;并駐留于應(yīng)用程序地址空間;調(diào)用時(shí)控制從應(yīng)用程序轉(zhuǎn)向庫(kù)程序,并進(jìn)一步調(diào)用一個(gè)或多個(gè)底層操作系統(tǒng)的功能調(diào)用。2.2套接字編程的基本概念圖2.1電插座與電話插座的作用2.2.1什么是套接字(SOCKET)套接字是對(duì)網(wǎng)絡(luò)中不同主機(jī)上應(yīng)用進(jìn)程之間進(jìn)行雙向通信的端點(diǎn)的抽象。一個(gè)套接字就是網(wǎng)絡(luò)上進(jìn)程通信的一端,提供了應(yīng)用層進(jìn)程利用網(wǎng)絡(luò)協(xié)議棧交換數(shù)據(jù)的機(jī)制。圖
7、2.2應(yīng)用進(jìn)程、套接口、網(wǎng)絡(luò)協(xié)議棧及操作系統(tǒng)的關(guān)系兩個(gè)應(yīng)用進(jìn)程只要分別連接到自己的套接字,就可以通過(guò)網(wǎng)絡(luò)痛惜,不用去管復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)及數(shù)據(jù)傳輸過(guò)程。從多個(gè)層面來(lái)理解套接字這個(gè)概念的內(nèi)涵從所處的地位來(lái)講,套接字上聯(lián)應(yīng)用進(jìn)程,下聯(lián)網(wǎng)絡(luò)協(xié)議棧,是應(yīng)用程序通過(guò)網(wǎng)絡(luò)協(xié)議棧進(jìn)行通信的接口,是應(yīng)用程序與網(wǎng)絡(luò)協(xié)議棧交互的接口.從實(shí)現(xiàn)的角度來(lái)講,非常復(fù)雜。套接字是一個(gè)復(fù)雜的軟件機(jī)構(gòu),包含了一定的數(shù)據(jù)結(jié)構(gòu),包含許多選項(xiàng),由操作系統(tǒng)內(nèi)核管理。從使用的角度來(lái)講,非常簡(jiǎn)單。對(duì)套接字的操作形成了一種網(wǎng)絡(luò)應(yīng)用程序的編程接口(API),提供了一組系統(tǒng)調(diào)用或庫(kù)函數(shù),可以
8、用于構(gòu)造套接字、安裝綁定套接字、連接套接字、通過(guò)套接字交換數(shù)據(jù)、關(guān)閉套接字,實(shí)現(xiàn)各種分布式應(yīng)用。套接字編程接口是一套操作套接字的編程接口函數(shù),套接字是它的操作對(duì)象。2.2.2套接字的特點(diǎn)1.通信域通信域:是