C++ - socket編程基礎(chǔ)(理論篇)-_第1頁(yè)
C++ - socket編程基礎(chǔ)(理論篇)-_第2頁(yè)
C++ - socket編程基礎(chǔ)(理論篇)-_第3頁(yè)
C++ - socket編程基礎(chǔ)(理論篇)-_第4頁(yè)
C++ - socket編程基礎(chǔ)(理論篇)-_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+看一下通訊那塊吧,SOCKET、TCP/ip、udp對(duì)于SOCKET在這里我不想究其歷史,我只想說(shuō)其時(shí)它是一種進(jìn)程通訊的方式,簡(jiǎn)言之就是調(diào)用這個(gè)網(wǎng)絡(luò)庫(kù)的一些API函數(shù)就能實(shí)現(xiàn)分布在不同主機(jī)的相關(guān)進(jìn)程之間的數(shù)據(jù)交換.SOCKET中首先我們要理解如下幾個(gè)定義概念:一是IP地址:IP Address我想很容易理解,就是依照TCP/IP協(xié)議分配給本地主機(jī)的網(wǎng)絡(luò)地址,就向兩個(gè)進(jìn)程要通訊,任一進(jìn)程要知道通訊對(duì)方的位置,位置如何來(lái)確定,就用對(duì)方的IP二是端口號(hào):用來(lái)標(biāo)識(shí)本地通訊進(jìn)程,方便OS提交數(shù)據(jù).就是說(shuō)進(jìn)程指定了對(duì)方進(jìn)程的網(wǎng)絡(luò)IP,但這個(gè)IP只是用來(lái)標(biāo)識(shí)進(jìn)程所在的主機(jī),如何來(lái)找到運(yùn)行在這個(gè)主機(jī)的這個(gè)

2、進(jìn)程呢,就用端口號(hào).三是連接:指兩個(gè)進(jìn)程間的通訊鏈路.四是半相關(guān):網(wǎng)絡(luò)中用一個(gè)三元組可以在全局唯一標(biāo)志一個(gè)進(jìn)程:(協(xié)議,本地地址,本地端口號(hào)這樣一個(gè)三元組,叫做一個(gè)半相關(guān),它指定連接的每半部分。五是全相關(guān)一個(gè)完整的網(wǎng)間進(jìn)程通信需要由兩個(gè)進(jìn)程組成,并且只能使用同一種高層協(xié)議。也就是說(shuō),不可能通信的一端用TCP協(xié)議,而另一端用UDP協(xié)議。因此一個(gè)完整的網(wǎng)間通信需要一個(gè)五元組來(lái)標(biāo)識(shí):(協(xié)議,本地地址,本地端口號(hào),遠(yuǎn)地地址,遠(yuǎn)地端口號(hào)這樣一個(gè)五元組,叫做一個(gè)相關(guān)(association,即兩個(gè)協(xié)議相同的半相關(guān)才能組合成一個(gè)合適的相關(guān),或完全指定組成一連接??蛻?hù)/服務(wù)器模式在TCP/IP網(wǎng)絡(luò)應(yīng)用中,通信

3、的兩個(gè)進(jìn)程間相互作用的主要模式是客戶(hù)/服務(wù)器模式(Client/Server model,即客戶(hù)向服務(wù)器發(fā)出服務(wù)請(qǐng)求,服務(wù)器接收到請(qǐng)求后,提供相應(yīng)的服務(wù)??蛻?hù)/服務(wù)器模式的建立基于以下兩點(diǎn):首先,建立網(wǎng)絡(luò)的起因是網(wǎng)絡(luò)中軟硬件資源、運(yùn)算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機(jī)提供服務(wù),資源較少的客戶(hù)請(qǐng)求服務(wù)這一非對(duì)等作用。其次,網(wǎng)間進(jìn)程通信完全是異步的,相互通信的進(jìn)程間既不存在父子關(guān)系,又不共享內(nèi)存緩沖區(qū),因此需要一種機(jī)制為希望通信的進(jìn)程間建立聯(lián)系,為二者的數(shù)據(jù)交換提供同步,這就是基涌紀(jì)紀(jì)戶(hù)/服務(wù)器模式的TCP/IP。客戶(hù)/服務(wù)器模式鑰紀(jì)紀(jì)作過(guò)程中采取的是主動(dòng)請(qǐng)求方式:首先服務(wù)器方

4、要先啟動(dòng),并根據(jù)請(qǐng)求提供相應(yīng)服務(wù):1. 打開(kāi)一通信通道并告知本地主機(jī),它愿意在某一公認(rèn)地址上(周知口,如FTP為21接收客戶(hù)請(qǐng)求;2. 等待客戶(hù)請(qǐng)求到達(dá)該端口;3. 接收到重復(fù)服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答信號(hào)。接收到并發(fā)服務(wù)請(qǐng)求,要激活一新進(jìn)程來(lái)處理這個(gè)客戶(hù)請(qǐng)求(如UNIX系統(tǒng)中用fork、exec。新進(jìn)程處理此客戶(hù)請(qǐng)求,并不需要對(duì)其它請(qǐng)求作出應(yīng)答。服務(wù)完成后,關(guān)閉此新進(jìn)程與客戶(hù)的通信鏈路,并終止。4. 返回第二步,等待另一客戶(hù)請(qǐng)求。5. 關(guān)閉服務(wù)器客戶(hù)方:1. 打開(kāi)一通信通道,并連接到服務(wù)器所在主機(jī)的特定端口;2. 向服務(wù)器發(fā)服務(wù)請(qǐng)求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請(qǐng)求.3. 請(qǐng)求結(jié)束后關(guān)閉

5、通信通道并終止。從上面所描述過(guò)程可知:1. 客戶(hù)與服務(wù)器進(jìn)程的作用是非對(duì)稱(chēng)的,因此編碼不同。2. 服務(wù)進(jìn)程一般是先涌紀(jì)紀(jì)戶(hù)請(qǐng)求而啟動(dòng)的。只要系統(tǒng)運(yùn)行,該服務(wù)進(jìn)程一直存在,直到正常或強(qiáng)迫終止。介紹完基礎(chǔ)知識(shí),下面就介紹一些API函數(shù):創(chuàng)建套接字socket(應(yīng)用程序在使用套接字前,首先必須擁有一個(gè)套接字,系統(tǒng)調(diào)用socket(向應(yīng)用程序提供創(chuàng)建套接字的手段,其調(diào)用格式如下:SOCKET PASCAL FAR socket(int af, int type, int protocol;該調(diào)用要接收三個(gè)參數(shù):af、type、protocol。參數(shù)af指定通信發(fā)生的區(qū)域,:AF_UNIX、AF_INE

6、T、AF_NS等,而DOS、WINDOWS中僅支持AF_INET,它是網(wǎng)際網(wǎng)區(qū)域。因此,地址族與協(xié)議族相同。參數(shù)type 描述要建立的套接字的類(lèi)型。這里分三種:一是TCP流式套接字(SOCK_STREAM提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無(wú)長(zhǎng)度限制。文件傳送協(xié)議(FTP即使用流式套接字。二是數(shù)據(jù)報(bào)式套接字(SOCK_DGRAM提供了一個(gè)無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無(wú)錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。網(wǎng)絡(luò)文件系統(tǒng)(NFS使用數(shù)據(jù)報(bào)式套接字。三是原始式套接字(SOCK_R

7、AW該接口允許對(duì)較低層協(xié)議,如IP、ICMP直接訪問(wèn)。常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問(wèn)現(xiàn)有服務(wù)中配置的新設(shè)備.參數(shù)protocol說(shuō)明該套接字使用的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認(rèn)的連接模式。根據(jù)這三個(gè)參數(shù)建立一個(gè)套接字,并將相應(yīng)的資源分配給它,同時(shí)返回一個(gè)整型套接字號(hào)。因此,socket(系統(tǒng)調(diào)用實(shí)際上指定了相關(guān)五元組中的“協(xié)議”這一元。指定本地地址bind(當(dāng)一個(gè)套接字用socket(創(chuàng)建后,存在一個(gè)名字空間(地址族,但它沒(méi)有被命名。bind(將套接字地址(包括本地主機(jī)地址和本地端口地址與所創(chuàng)建的套接字號(hào)聯(lián)系起來(lái),即將名字賦予套接字,以指定本地半相關(guān)。其調(diào)用格式

8、如下:int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen;參數(shù)s是由socket(調(diào)用返回的并且未作連接的套接字描述符(套接字號(hào)。參數(shù)name 是賦給套接字s的本地地址(名字,其長(zhǎng)度可變,結(jié)構(gòu)隨通信域的不同而不同。namelen表明了name的長(zhǎng)度.如果沒(méi)有錯(cuò)誤發(fā)生,bind(返回0。否則返回SOCKET_ERROR。建立套接字連接connect(與accept(這兩個(gè)系統(tǒng)調(diào)用用于完成一個(gè)完整相關(guān)的建立,其中connect(用于建立連接。無(wú)連接的套接字進(jìn)程也可以調(diào)用connect(,但這時(shí)在進(jìn)程

9、之間沒(méi)有實(shí)際的報(bào)文交換,調(diào)用將從本地操作系統(tǒng)直接返回。這樣做的優(yōu)點(diǎn)是程序員不必為每一數(shù)據(jù)指定目的地址,而且如果收到的一個(gè)數(shù)據(jù)報(bào),其目的端口未與任何套接字建立“連接”,便能判斷該端靠紀(jì)紀(jì)可操作。而accept(用于使服務(wù)器等待來(lái)自某客戶(hù)進(jìn)程的實(shí)際連接。connect(的調(diào)用格式如下:int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen;參數(shù)s是欲建立連接的本地套接字描述符。參數(shù)name指出說(shuō)明對(duì)方套接字地址結(jié)構(gòu)的指針。對(duì)方套接字地址長(zhǎng)度由namelen說(shuō)明。如果沒(méi)有錯(cuò)誤發(fā)生,connect(返

10、回0。否則返回值SOCKET_ERROR。在面向連接的協(xié)議中,該調(diào)用導(dǎo)致本地系統(tǒng)和外部系統(tǒng)之間連接實(shí)際建立。由于地址族總被包含在套接字地址結(jié)構(gòu)的前兩個(gè)字節(jié)中,并通過(guò)socket(調(diào)用與某個(gè)協(xié)議族相關(guān)。因此bind(和connect(無(wú)須協(xié)議作為參數(shù)。accept(的調(diào)用格式如下:SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen;參數(shù)s為本地套接字描述符,在用做accept(調(diào)用的參數(shù)前應(yīng)該先調(diào)用過(guò)listen(。addr 指向客戶(hù)方套接字地址結(jié)構(gòu)的指針,用來(lái)接收連接實(shí)體的地址。addr的

11、確切格式由套接字創(chuàng)建時(shí)建立的地址族決定。addrlen 為客戶(hù)方套接字地址的長(zhǎng)度(字節(jié)數(shù)。如果沒(méi)有錯(cuò)誤發(fā)生, accept(返回一個(gè)SOCKET類(lèi)型的值,表示接收到的套接字的描述符。否則返回值INVALID_SOCKET。accept( 用于面向連接服務(wù)器。參數(shù)addr和addrlen存放客戶(hù)方的地址信息。調(diào)用前,參數(shù)addr 指向一個(gè)初始值為空的地址結(jié)構(gòu),而addrlen 的初始值為0;調(diào)用accept(后,服務(wù)器等待從編號(hào)為s的套接字上接受客戶(hù)連接請(qǐng)求,而連接請(qǐng)求是由客戶(hù)方的connect(調(diào)用發(fā)出的。當(dāng)有連接請(qǐng)求到達(dá)時(shí),accept(調(diào)用將請(qǐng)求連接隊(duì)列上的第一個(gè)客戶(hù)方套接字地址及長(zhǎng)度放入

12、addr 和addrlen,并創(chuàng)建一個(gè)與s有相同特性的新套接字號(hào)。新的套接字可用于處理服務(wù)器并發(fā)請(qǐng)求。四個(gè)套接字系統(tǒng)調(diào)用,socket(、bind(、connect(、accept(,可以完成一個(gè)完全五元相關(guān)的建立。socket(指定五元組中的協(xié)議元,它的用法與是否為客戶(hù)或服務(wù)器、是否面向連接無(wú)關(guān)。bind(指定五元組中的本地二元,即本地主機(jī)地址和端口號(hào),其用法與是否面向連接有關(guān):在服務(wù)器方,無(wú)論是否面向連接,均要調(diào)用bind(,若采用面向連接,則可以不調(diào)用bind(,而通過(guò)connect(自動(dòng)完成。若采用無(wú)連接,客戶(hù)方必須使用bind(以獲得一個(gè)唯一的地址。監(jiān)聽(tīng)連接listen(此調(diào)用用于面

13、向連接服務(wù)器,表明它愿意接收連接。listen(需在accept(之前調(diào)用,其調(diào)用格式如下:int PASCAL FAR listen(SOCKET s, int backlog;參數(shù)s標(biāo)識(shí)一個(gè)本地已建立、尚未連接的套接字號(hào),服務(wù)器愿意從它上面接收請(qǐng)求。backlog表示請(qǐng)求連接隊(duì)列的最大長(zhǎng)度,用于限制排隊(duì)請(qǐng)求的個(gè)數(shù),目前允許的最大值為5。如果沒(méi)有錯(cuò)誤發(fā)生,listen(返回0。否則它返回SOCKET_ERROR。listen(在執(zhí)行調(diào)用過(guò)程中可為沒(méi)有調(diào)用過(guò)bind(的套接字s完成所必須的連接,并建立長(zhǎng)度為backlog的請(qǐng)求連接隊(duì)列。調(diào)用listen(是服務(wù)器接收一個(gè)連接請(qǐng)求的四個(gè)步驟中的第

14、三步。它在調(diào)用socket(分配一個(gè)流套接字,且調(diào)用bind(給s賦于一個(gè)名字之后調(diào)用,而且一定要在accept(之前調(diào)用。數(shù)據(jù)傳輸send(與recv(當(dāng)一個(gè)連接建立以后,就可以傳輸數(shù)據(jù)了。常用的系統(tǒng)調(diào)用有send(和recv(。send(調(diào)用用于鑰紀(jì)紀(jì)數(shù)s指定的已連接的數(shù)據(jù)報(bào)或流套接字上發(fā)送輸出數(shù)據(jù),格式如下:int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags;參數(shù)s為已連接的本地套接字描述符。buf 指向存有發(fā)送數(shù)據(jù)的緩沖區(qū)的指針,其長(zhǎng)度由len 指定。flags 指定傳輸控制方式,如是否發(fā)送帶外數(shù)據(jù)

15、等。如果沒(méi)有錯(cuò)誤發(fā)生,send(返回總共發(fā)送的字節(jié)數(shù)。否則它返回SOCKET_ERROR。recv(調(diào)用用于s指定的已連接的數(shù)據(jù)報(bào)或流套接字上接收輸入數(shù)據(jù),格式如下:int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags;參數(shù)s 為已連接的套接字描述符。buf指向接收輸入數(shù)據(jù)緩沖區(qū)的指針,其長(zhǎng)度由len 指定。flags 指定傳輸控制方式,如是否接收帶外數(shù)據(jù)等。如果沒(méi)有錯(cuò)誤發(fā)生,recv(返回總共接收的字節(jié)數(shù)。如果連接被關(guān)閉,返回0。否則它返回SOCKET_ERROR。輸入/輸出多路復(fù)用select(select( 調(diào)用用

16、來(lái)檢測(cè)一個(gè)或多個(gè)套接字的狀態(tài)。對(duì)每一個(gè)套接字來(lái)說(shuō),這個(gè)調(diào)用可以請(qǐng)求讀、寫(xiě)或錯(cuò)誤狀態(tài)方面的信息。請(qǐng)求給定狀態(tài)的套接字集合由一個(gè)fd_set結(jié)構(gòu)指示。在返回時(shí),此結(jié)構(gòu)被更新,以反映那些滿(mǎn)足特定條件的套接字的子集,同時(shí),select(調(diào)用返回滿(mǎn)足條件的套接字的數(shù)目,其調(diào)用格式如下:int PASCAL FAR select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout;參數(shù)nfds指明被檢查的套接字描述符的值域,此變量一般被忽略。參數(shù) readfds 指向要做讀檢測(cè)的套接字描述符集合的指針,調(diào)用者希望從中讀取數(shù)據(jù)。 參數(shù) writefds 指向要做寫(xiě)檢測(cè)的套接字描述符集合的指針。 exceptfds 指向要檢測(cè)是否出錯(cuò) 的套接字描述符集合的指針。timeout 指向 select(函數(shù)等待的最大時(shí)間,如果設(shè)為 NULL 則 為阻塞操作。 select(返回包含在 fd_set 結(jié)構(gòu)中已準(zhǔn)備好的套接字描述符的總數(shù)目, 或者是發(fā) 生錯(cuò)誤則返回 SOCKET_ERROR。 關(guān)閉套接字closesocket( closesocket(關(guān)閉套接字 s,并釋放分配給該套接字的資源;如果 s 涉及一個(gè)打開(kāi)的 TC

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論