《計(jì)算機(jī)網(wǎng)絡(luò)與因特網(wǎng)》課件第三章 Socket 接口_第1頁
《計(jì)算機(jī)網(wǎng)絡(luò)與因特網(wǎng)》課件第三章 Socket 接口_第2頁
《計(jì)算機(jī)網(wǎng)絡(luò)與因特網(wǎng)》課件第三章 Socket 接口_第3頁
《計(jì)算機(jī)網(wǎng)絡(luò)與因特網(wǎng)》課件第三章 Socket 接口_第4頁
《計(jì)算機(jī)網(wǎng)絡(luò)與因特網(wǎng)》課件第三章 Socket 接口_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

?計(jì)算機(jī)網(wǎng)絡(luò)與因特網(wǎng)?課件第三章Socket接口PARTIVNetworkApplicationsChapter3TheSocketInterface

Socket

接口3.3TheSocketAPIAlthoughprotocolstandardsallowoperatingsystemdesignerstochooseanAPI,manyhaveadoptedtheSocketAPI.TheSocketAPIisavailableformanyoperatingsystems.TheSocketAPIoriginatedaspartoftheBSDUnixoperatingsystem.TheSocketAPIisadefactostandard.3.4SocketsAndSocketLibrariesInBSDUnixandthesystemderivedfromit,socketfunctionsarepartoftheoperatingsystemitself.Inmanycases,insteadofmodifyingtheirbasicoperatingsystem,vendorscreatedasocketlibrarythatprovidestheSocketAPI.AsocketlibrarycanprovideapplicationswithasocketAPIonacomputersystemthatdoesnotprovidenativesockets.Whenanapplicationcallsoneofthesocketprocedures,controlpassestoalibraryroutinethatmakesoneormorecallstotheunderlyingoperatingsystemtoimplementthesocketfunction.3.5SocketCommunicationAndUnixI/OAnapplicationcommunicatesthroughasocketsimilartothewaytheapplicationtransfersdatatoorfromafile.Unixusesanopen-read-write-closeparadigmforallI/o補(bǔ)充:1.SocketAPI與UnixUnix是一個(gè)通用的交互式多用戶分時(shí)操作系統(tǒng)。Unix由AT&T公司Bell實(shí)驗(yàn)室于1969年開發(fā)。Unix有兩個(gè)主要的流派:SystemV和BSDSystemV由最初的AT&TUnix演化而來。BSDUnix是由加州大學(xué)伯克利(Berkeley)分校開發(fā),其目標(biāo)是提供一個(gè)具有復(fù)雜網(wǎng)絡(luò)支持的開放系統(tǒng)。TCP/IP協(xié)議族也與Unix的開展有很密切關(guān)系。SocketAPI與Unix操作系統(tǒng)關(guān)系非常密切。

UNIX系統(tǒng)的I/O命令集,其模式為翻開一讀/寫一關(guān)閉〔open-write-read-close〕。在一個(gè)用戶進(jìn)程進(jìn)行I/O操作時(shí),它首先調(diào)用“翻開〞獲得對指定文件或設(shè)備的使用權(quán),并返回稱為文件描述符的整型數(shù),以描述用戶在翻開的文件或設(shè)備上進(jìn)行I/O操作的進(jìn)程。然后這個(gè)用戶進(jìn)程屢次調(diào)用“讀/寫〞以傳輸數(shù)據(jù)。當(dāng)所有的傳輸操作完成后,用戶進(jìn)程關(guān)閉調(diào)用,通知操作系統(tǒng)已經(jīng)完成了對某對象的使用。TCP/IP協(xié)議被集成到UNIX內(nèi)核中時(shí),相當(dāng)于在UNIX系統(tǒng)引入了一種新型的I/O操作。UNIX用戶進(jìn)程與網(wǎng)絡(luò)協(xié)議的交互作用比用戶進(jìn)程與傳統(tǒng)的I/O設(shè)備相互作用復(fù)雜得多。首先,進(jìn)行網(wǎng)絡(luò)操作的兩個(gè)進(jìn)程可能在不同主機(jī)上,如何建立它們之間的聯(lián)系?其次,存在多種網(wǎng)絡(luò)協(xié)議,如何建立一種通用機(jī)制以支持多種協(xié)議?這些都是網(wǎng)絡(luò)應(yīng)用編程所要解決的問題。進(jìn)程通信的概念最初來源于單機(jī)系統(tǒng)。由于每個(gè)進(jìn)程都在自己的地址范圍內(nèi)運(yùn)行,為保證兩個(gè)相互通信的進(jìn)程之間既互不干擾又協(xié)調(diào)一致工作,操作系統(tǒng)為進(jìn)程通信提供了相應(yīng)設(shè)施:如UNIX

BSD中的管道〔pipe〕、命名管道〔named

pipe〕和軟中斷信號〔signal〕,UNIX

system

V的消息〔message〕、共享存儲(chǔ)區(qū)〔shared

memory〕和信號量〔semaphore)等,但都僅限于用在本機(jī)進(jìn)程之間通信。2

進(jìn)程間通信3

網(wǎng)間進(jìn)程通信網(wǎng)間進(jìn)程通信要解決的是不同主機(jī)進(jìn)程間的相互通信問題??梢园淹瑱C(jī)進(jìn)程通信看作是其中的特例。為此,首先要解決的是網(wǎng)間進(jìn)程標(biāo)識(shí)問題。同一主機(jī)上,不同進(jìn)程可用進(jìn)程號〔process

ID〕唯一標(biāo)識(shí)。但在網(wǎng)絡(luò)環(huán)境下,各主機(jī)獨(dú)立分配的進(jìn)程號不能唯一標(biāo)識(shí)該進(jìn)程。其次,操作系統(tǒng)支持的網(wǎng)絡(luò)協(xié)議眾多,不同協(xié)議的工作方式不同,地址格式也不同。因此,網(wǎng)間進(jìn)程通信還要解決多重協(xié)議的識(shí)別問題。

3.6Sockets,Descriptors,AndnetworkI/OSocketcommunicationalsousesthedescriptorapproach.Beforeanapplicationcanuseprotocolstocommunicate,theapplicationmustrequesttheoperatingsystemtocreateasocketthatwillbeusedforcommunication.Thesystemreturnsasmallintegerdescriptorthatidentifiesthesocket.InaUniximplementation,socketsarecompletelyintegratedwithotherI/o.Asingleapplicationcanbewrittenthattransfersdatatoanarbitrarylocation.4.協(xié)議端口網(wǎng)絡(luò)中可以被命名和尋址的通信端口,是操作系統(tǒng)可分配的一種資源。

傳輸層與網(wǎng)絡(luò)層在功能上的最大區(qū)別是傳輸層提供進(jìn)程通信能力。因此,網(wǎng)絡(luò)通信的最終地址就不僅僅是主機(jī)地址了,還包括可以描述進(jìn)程的某種標(biāo)識(shí)符。為此,TCP/IP協(xié)議提出了協(xié)議端口〔protocol

port,簡稱端口〕的概念,用于標(biāo)識(shí)通信的進(jìn)程。

端口是一種抽象的軟件結(jié)構(gòu)〔包括一些數(shù)據(jù)結(jié)構(gòu)和I/O緩沖區(qū)〕。應(yīng)用程序〔即進(jìn)程〕通過系統(tǒng)調(diào)用與某端口建立連接〔binding〕后,傳輸層傳給該端口的數(shù)據(jù)都被相應(yīng)進(jìn)程所接收,相應(yīng)進(jìn)程發(fā)給傳輸層的數(shù)據(jù)都通過該端口輸出。在TCP/IP協(xié)議的實(shí)現(xiàn)中,端口間的操作類似于一般的I/O操作,進(jìn)程獲取一個(gè)端口,相當(dāng)于獲取本地唯一的I/O文件,可以用一般的讀寫原語訪問之。

類似于文件描述符,每個(gè)端口都擁有一個(gè)叫端口號〔port

number〕的整數(shù)型標(biāo)識(shí)符,用于區(qū)別不同端口。由于TCP/IP傳輸層的兩個(gè)協(xié)議TCP和UDP是完全獨(dú)立的兩個(gè)軟件模塊,因此各自的端口號也相互獨(dú)立,如TCP有一個(gè)255號端口,UDP也可以有一個(gè)255號端口,二者并不沖突。半相關(guān)

網(wǎng)絡(luò)中用一個(gè)三元組可以在全局唯一標(biāo)志一個(gè)進(jìn)程:

〔協(xié)議,本地地址,本地端口號〕

這樣一個(gè)三元組,叫做一個(gè)半相關(guān)〔half-association〕,它指定連接的每半局部。全相關(guān)一個(gè)完整的網(wǎng)間進(jìn)程通信需要由兩個(gè)進(jìn)程組成,并且只能使用同一種高層協(xié)議。一個(gè)完整的網(wǎng)間通信需要一個(gè)五元組來標(biāo)識(shí):

〔協(xié)議,本地地址,本地端口號,遠(yuǎn)程地址,遠(yuǎn)程端口號〕

這樣一個(gè)五元組,叫做一個(gè)相關(guān)〔association〕,即兩個(gè)協(xié)議相同的半相關(guān)才能組合成一個(gè)適宜的相關(guān),或完全指定組成一連接。

Socket接口應(yīng)用程序的根本網(wǎng)絡(luò)接口由操作系統(tǒng)提供;進(jìn)程的通信端點(diǎn)一個(gè)socket的信息含義協(xié)議類型本地地址本地端口號遠(yuǎn)端地址遠(yuǎn)端端口號3.7ParametersAndTheSocketAPISocketprogrammingdiffersfromconventionalI/o.Becauseanapplicationmustspecifymanydetailstouseasocket.Toaccommodateallthedetails,eachsockethasmanyparametersandoptions.Toavoidhavingasinglesocketfunctionwithseparateparametersforeachoption,designersofthesocketAPIchosetodefinemanyfunction.插口結(jié)構(gòu)Client-Server執(zhí)行模式Client-Server端執(zhí)行模式SocketbindlistenacceptSend/recv(循環(huán))closeSocketconnectSend/recv(循環(huán))close通信階段連接建立階段關(guān)閉階段準(zhǔn)備階段ServerClient注意:上面這些Socket的意思與指IP地址和TCP端口號的組合的Socket不同3.8ProceduresthatImplementTheSocketAPI27.8.1TheSocketProcedure.descriptor=socket(protofamily,type,protocol)

Returnasocketdescriptorifsuccessful; -1iferror.TheSocketProcedure:Thesocketprocedurecreatesasocketandreturnsanintegerdescriptor.Itsetsvaluesforonlythefirstthreefieldsofthesocketstructure.Theotherfieldsaresetbytheotherfunctionsorbytheoperatingsystem.Argument

Protofamily:1:AF-INET4IPv4協(xié)議2:AF-INET6IPv6協(xié)議3:AF-LOCALUnix域協(xié)議4:AF-ROUTE路由插口……Argumenttypespecifiesthetypeofcommunicationthesocketwilluse.

TCP/IP的socket提供以下三種類型插口。

1.SOCK_STREAM〔字節(jié)流插口〕

提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸效勞,數(shù)據(jù)無過失、無重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,防止數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。文件傳送協(xié)議〔FTP〕即使用流式插口。

2.SOCK_DGRAM(數(shù)據(jù)報(bào)插口〕

提供了一個(gè)無連接效勞。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無錯(cuò)保證,

數(shù)據(jù)可能喪失或重復(fù),并且接收順序混亂。網(wǎng)絡(luò)文件系統(tǒng)〔NFS〕使用數(shù)據(jù)報(bào)式插口。

3.SOCK_RAW(原始插口〕

該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問現(xiàn)有效勞中配置的新設(shè)備。

typeAF_INETAF_INET6SOCK_STREAMTCPTCPSOCK_DGRAMUDPUDPSOCK_RAWIPv4IPv6Family與type的組合Argumentprotocol一般情況將其設(shè)置為0,除非用在原始插口上。Protocol的常量在頭文件<netinet/in.h>中定義,常量名以IPPROTO_開頭。例如:IPPROTO_IGMPIPPROTO_IPIPPROTO_ICMPTheBindProcedureThebindfunctionbindsasockettoalocalsocketaddressbyaddingthelocalsocketaddresstoanalreadycreatedsocket.其調(diào)用格式如下:

bind〔socket,localaddr,addrlen〕

Returns0ifsuccessful;-1iferror.當(dāng)一個(gè)socket用socket()創(chuàng)立后,存在一個(gè)名字空間(地址族),但它沒有被命名。bind()將socket地址〔包括本地主機(jī)地址和本地端口地址〕與所創(chuàng)立的socket號聯(lián)系起來,即將名字賦予socket,以指定本地半相關(guān)。對于效勞器而言,需要將插口綁定到一個(gè)的端口上,因?yàn)橹挥羞@樣,客戶端才知道該往何處發(fā)起連接。為此,需要調(diào)用bind()函數(shù),并設(shè)置其參數(shù)。設(shè)置插口地址結(jié)構(gòu)的幾種常見方式IP地址端口說明通配地址0內(nèi)核自動(dòng)選擇IP地址和端口通配地址非0內(nèi)核自動(dòng)選擇IP地址,進(jìn)程指定端口本地IP地址0進(jìn)程指定IP地址,內(nèi)核自動(dòng)選擇端口本地IP地址非0IP地址和端口均由應(yīng)用進(jìn)程指定“通配地址〞通常由常量INADDR_ANY指定地址在建立socket通信過程中起著重要作用,作為一個(gè)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)者對socket地址結(jié)構(gòu)必須有明確認(rèn)識(shí)。例如,UNIX

BSD有一組描述socket地址的數(shù)據(jù)結(jié)構(gòu).TCP/IP協(xié)議使用

sockaddr_in來定義地址

structsockaddr_in{u_charsin_len;/*地址總長*/u_charsin_family;/*地址族AF_INET*/u_shortsin_port;/*協(xié)議端口號*//*16位端口號,網(wǎng)絡(luò)字節(jié)順序*/structin_addrsin_addr;/*計(jì)算機(jī)IP地址*//*32位IP地址,網(wǎng)絡(luò)字節(jié)順序*/

charsin_zero[8];/*保存,未用〔置為0〕*/};其中:Structin_addr{u_longs_addr;/*將IP地址作為一個(gè)32位的二進(jìn)制數(shù)來保存*/};插口地址結(jié)構(gòu)網(wǎng)絡(luò)字節(jié)順序不同的計(jì)算機(jī)存放多字節(jié)值的順序不同,有的機(jī)器在起始地址存放低位字節(jié)〔小數(shù)在前〕,有的存高位字節(jié)〔大數(shù)在前〕。為保證數(shù)據(jù)的正確性,在網(wǎng)絡(luò)協(xié)議中須指定網(wǎng)絡(luò)字節(jié)順序。TCP/IP協(xié)議使用16位整數(shù)和32位整數(shù)的大數(shù)在前格式,它們均含在協(xié)議頭文件中。

大數(shù)在前的字節(jié)順序〔Big-endianbyteorder〕主機(jī)中的字節(jié)順序〔1〕小數(shù)在前的字節(jié)順序〔Little-endianbyteorder〕主機(jī)中的字節(jié)順序〔2〕TCP/IP協(xié)議族選擇的是大數(shù)在前的字節(jié)順序TheListenProcedureThelistenfunctioniscalledonlybytheTCPserver.Itcreatesapassivesocketfromanunconnectedsocket.Beforecallingthelistenfunction,thesocketmustalreadybecreatedandthelocalsocketaddressfieldsset.Thisfunctioninformstheoperatingsystemthattheserverisreadytoacceptconnectionthroughthissocket.監(jiān)聽連接──listen()

此調(diào)用用于面向連接效勞器,說明它愿意接收連接。listen()需在accept()之前調(diào)用,其調(diào)用格式如下:

listen〔socket,queuesize〕參數(shù)Socket:表示socket的描述符,標(biāo)識(shí)一個(gè)本地已建立、尚未連接的插口號,效勞器愿意從它上面接收請求.Queuesize:表示該socket的請求隊(duì)列的長度。用于限制排隊(duì)請求的個(gè)數(shù),目前允許的最大值為5。Returns0ifsuccessful;-1iferror.調(diào)用listen()是效勞器接收一個(gè)連接請求的四個(gè)步驟中的第三步。它在調(diào)用socket()分配一個(gè)流插口,且調(diào)用bind()給它賦于一個(gè)名字之后調(diào)用,而且一定要在accept()之前調(diào)用。

TheAcceptProcedureTheacceptfunctioniscalledbyaTCPservertoremovethefirstconnectionrequestfromthecorrespondingqueue.Iftherearenorequests(thequeueisempty),theacceptfunctionisputtosleep.accept調(diào)用的形式為:newsock=accept〔socket,caddress,caddresslen〕參數(shù)socket是效勞器已經(jīng)創(chuàng)立并綁定于指定協(xié)議端口的插口描述符。參數(shù)caddress是sockaddr類型結(jié)構(gòu)的地址caddresslen那么是一個(gè)指向整型的指針。accept為該連接創(chuàng)立一個(gè)新的插口,并將這個(gè)新的插口描述符返回給調(diào)用者。效勞器使用這個(gè)新的插口與客戶進(jìn)行通信,然后在結(jié)束后關(guān)閉該插口。同時(shí),效勞器原始的插口保持不變—在效勞器結(jié)束與一個(gè)客戶的通信后,它使用這個(gè)原始的插口來接收下一個(gè)客戶的連接。TheConnectProcedureTheconnectfunctionisusedbyaprocess(usuallyaclient)toestablishanactiveconnectiontoaremoteprocess(normallyaserver).調(diào)用形式為:connect〔socket,saddress,saddresslen〕Returns0ifsuccessful;-1iferror參數(shù)socket是客戶端計(jì)算機(jī)上用于該連接的插口的描述符。參數(shù)saddress是一個(gè)sockaddr結(jié)構(gòu),說明效勞器地址與協(xié)議端口號〔IP地址和協(xié)議端口號合在一起有時(shí)被稱作端地址,即endpointaddress〕。參數(shù)saddresslen是以字節(jié)形式說明的效勞器地址的長度。四個(gè)函數(shù)調(diào)用,socket()、bind()、connect()、accept(),可以完成一個(gè)完全五元相關(guān)的建立。socket()指定五元組中的協(xié)議元,它的用法與是否為客戶或效勞器、是否面向連接無關(guān)。bind()指定五元組中的本地二元,即本地主機(jī)地址和端口號,其用法與是否面向連接有關(guān):在效勞器方,無論是否面向連接,均要調(diào)用bind();在客戶方,假設(shè)采用面向連接,那么可以不調(diào)用bind(),而通過connect()自動(dòng)完成。假設(shè)采用無連接,客戶方必須使用bind()以獲得一個(gè)唯一的地址。

建立socket連接:connect()與accept()

這兩個(gè)函數(shù)調(diào)用用于完成一個(gè)完整相關(guān)的建立:connect()用于由客戶方發(fā)起建立連接。accept()用于使效勞器等待來自某客戶進(jìn)程的實(shí)際連接。

數(shù)據(jù)傳輸數(shù)據(jù)傳輸──send()與recv()

當(dāng)一個(gè)連接建立以后,就可以傳輸數(shù)據(jù)了。常用的調(diào)用有send()和recv()。

send()調(diào)用輸出數(shù)據(jù),格式如下:

send〔socket,data,length,flag〕參數(shù)socket是使用的插口的描述符。參數(shù)data是待發(fā)送數(shù)據(jù)在內(nèi)存中的地址,參數(shù)length是一個(gè)整型數(shù),表示數(shù)據(jù)的字節(jié)數(shù),參數(shù)flag那么包含了請求特殊選項(xiàng)的位〔許多項(xiàng)選擇項(xiàng)是為系統(tǒng)調(diào)試設(shè)計(jì)的,并不能被普通的客戶和效勞器程序使用〕。recv()調(diào)用用于接收輸入數(shù)據(jù),格式如下:

recv〔socket,buffer,length,flags〕參數(shù)socket是從中接收數(shù)據(jù)的插口的描述符。參數(shù)buffer表示用來存放接收到的數(shù)據(jù)的內(nèi)存地址,參數(shù)length那么表示這個(gè)緩沖區(qū)的大小。參數(shù)flag允許調(diào)用者控制一些細(xì)節(jié)〔例如,允許應(yīng)用在不將信息從插口中移出的情況下提取它的一個(gè)副本等〕。無連接效勞面向連接效勞Relationshipbetweentheclientandtheserver重復(fù)效勞器在一個(gè)時(shí)間只能和一個(gè)客戶程序建立連接,它對多個(gè)客戶程序的處理是采用循環(huán)的方式重復(fù)進(jìn)行,因此叫重復(fù)效勞器。并發(fā)效勞器和重復(fù)效勞器各有利弊:并發(fā)效勞器可以改善客戶程序的響應(yīng)速度,但它增加了系統(tǒng)調(diào)度的開銷;重復(fù)效勞器正好與其相反,因此用戶在決定是使用并發(fā)效勞器還是重復(fù)效勞器時(shí),要根據(jù)應(yīng)用的實(shí)際情況來定。

附錄1.Memset:將一個(gè)指明的字節(jié)數(shù)設(shè)置為一個(gè)值,第一個(gè)變量是指針,它指向目的地,第二個(gè)變量是它的值,第三個(gè)變量是字節(jié)數(shù)。例如:memset(&x,0,sizeof(x))字節(jié)操縱函數(shù)2.Memcpy:將一個(gè)字段的值復(fù)制到另一個(gè)字段,第一個(gè)變量是指向目的地的指針,第二個(gè)變量是指向源的指針,第三個(gè)變量是字節(jié)數(shù)。例如:memcpy(&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論