• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ?第二部分Winsock API
            ?
            ?Wi n s o c k是網(wǎng)絡(luò)編程接口,而不是協(xié)議。它從U n i x平臺(tái)的B e r k e l e y(B S D)套接字方案借鑒了許多東西,后者能訪問(wèn)多種網(wǎng)絡(luò)協(xié)議。在Wi n 3 2環(huán)境中,Wi n s o c k接口最終成為一個(gè)真正的“與協(xié)議無(wú)關(guān)”接口,尤其是在Winsock 2發(fā)布之后。
            本部分開(kāi)始之前,我們假定大家已具備了Wi n s o c k(或B S D套接字)的基本知識(shí),而且多少熟悉一些客戶機(jī)/服務(wù)器的Wi n s o c k基本知識(shí)。

            第5章網(wǎng)絡(luò)原理和協(xié)議

            建立Winsock 2規(guī)范的主要目的是提供一個(gè)與協(xié)議無(wú)關(guān)的傳送接口。

            5.1 協(xié)議的特征
            本章第一小節(jié)著重講解目前常用網(wǎng)絡(luò)傳送協(xié)議的一些基本特征。通過(guò)這里的學(xué)習(xí),大家可掌握與協(xié)議行為類型有關(guān)的一些背景知識(shí)。同時(shí),作為程序員,可大致知道特定協(xié)議在程序中的行為方式。

            5.1.1 面向消息
            對(duì)每個(gè)離散寫命令來(lái)說(shuō),如果傳送協(xié)議把它們(而且只有它們)當(dāng)做一條獨(dú)立的消息在網(wǎng)上傳送,我們就說(shuō)該協(xié)議是面向協(xié)議的。同時(shí),還意味著接收端在接收數(shù)據(jù)時(shí),返回的數(shù)據(jù)是發(fā)送端寫入的一條離散消息。接收端不能得到更多的消息,僅此而已。比如,在圖5 - 1中,
            左邊的工作站向右邊的工作站提交了三條分別是1 2 8、6 4和3 2字節(jié)的消息。作為接收端的工作站發(fā)出三條讀取命令,緩沖區(qū)是2 5 6個(gè)字節(jié)。后來(lái)的各次調(diào)用返回的分別是1 2 8、 6 4 和3 2個(gè)字節(jié)。第一次讀取調(diào)用不會(huì)將這所有的三個(gè)數(shù)據(jù)包都返回,即使這些數(shù)據(jù)包已經(jīng)收到也如此。這稱為“保護(hù)消息邊界”(preserving message boundaries),,一般出現(xiàn)在交換結(jié)構(gòu)化數(shù)據(jù)時(shí)。
            網(wǎng)絡(luò)游戲是“保護(hù)消息邊界”的較好范例。每個(gè)玩家均向別的玩家發(fā)出一個(gè)帶有地圖信息的數(shù)據(jù)包。這種通信后面的代碼很簡(jiǎn)單:一個(gè)玩家請(qǐng)求一個(gè)數(shù)據(jù)包,另一個(gè)玩家又準(zhǔn)確地從別的玩家處獲得一個(gè)地圖信息數(shù)據(jù)包。

            無(wú)保護(hù)消息邊界的協(xié)議通常稱作“基于流的協(xié)議”。大家要知道“基于流的協(xié)議”這一術(shù)語(yǔ)常用來(lái)指代附加特性。流服務(wù)的定義是連續(xù)的數(shù)據(jù)傳輸;不管消息邊界是否存在,接收端都會(huì)盡量地讀取有效數(shù)據(jù)。對(duì)發(fā)送端來(lái)說(shuō),意味著允許系統(tǒng)將原始消息分解成小消息或把幾條消息積累在一起,形成一個(gè)較大的數(shù)據(jù)包。對(duì)接收端來(lái)說(shuō),則是數(shù)據(jù)一到達(dá)網(wǎng)絡(luò)堆棧,
            網(wǎng)絡(luò)堆棧就開(kāi)始讀取它,并將它緩存下來(lái)等候進(jìn)程處理。在進(jìn)程請(qǐng)求處理大量數(shù)據(jù)時(shí),系統(tǒng)會(huì)在不溢出為客戶請(qǐng)求提供的緩沖區(qū)這一前提下,盡量返回更多的數(shù)據(jù)。在圖5 - 2中,發(fā)送端提交了三個(gè)數(shù)據(jù)包:分別是1 2 8、6 4和3 2個(gè)字節(jié);但是,本地系統(tǒng)堆棧自由地把這些數(shù)據(jù)聚合在一起,形成一個(gè)大的數(shù)據(jù)包。這種情況下,重組后的2個(gè)數(shù)據(jù)包就會(huì)一起傳輸。是否將各個(gè)獨(dú)立的數(shù)據(jù)包累積在一起受許多因素的影響,比如最大傳輸單元或N a g l e算法。在T C P / I P中,在將積累起來(lái)的數(shù)據(jù)發(fā)到線上之前, N a g l e算法在等候數(shù)據(jù)積累的主機(jī)中進(jìn)行。
            在需要發(fā)送的數(shù)據(jù)積累到一定數(shù)量或預(yù)定時(shí)間已超過(guò)之前,這個(gè)主機(jī)會(huì)一直等下去。實(shí)施N a g l e算法時(shí),主機(jī)的通信方在發(fā)送主機(jī)確認(rèn)之前,會(huì)等一等外出數(shù)據(jù),主機(jī)的通信方就不必發(fā)送一個(gè)只有確認(rèn)的數(shù)據(jù)包。發(fā)送小數(shù)據(jù)包不僅沒(méi)有多少意義,而且還會(huì)徒增錯(cuò)誤檢查和確認(rèn),相當(dāng)煩人。
            在接收端,網(wǎng)絡(luò)堆棧把所有進(jìn)來(lái)的數(shù)據(jù)包聚集在一起,歸入既定進(jìn)程。我們來(lái)看看圖5 - 2。
            如果接收端執(zhí)行一次2 5 6字節(jié)緩沖區(qū)的讀取,系統(tǒng)馬上就會(huì)返回2 2 4個(gè)字節(jié)。如果接收端只要求讀取2 0個(gè)字節(jié),系統(tǒng)就會(huì)只返回2 0個(gè)字節(jié)。

            偽流
            偽流( p s e u d o - s t r e a m)這個(gè)術(shù)語(yǔ)常用于某種系統(tǒng)中,該系統(tǒng)使用的協(xié)議是基于消息的,
            發(fā)送的數(shù)據(jù)分別在各自獨(dú)立的數(shù)據(jù)包內(nèi),接收端讀取并把消息緩存在一起,  這樣,接收應(yīng)用
            程序便可讀取任意大小的數(shù)據(jù)塊。把圖5 - 1中的發(fā)送端和圖5 - 2中的接收端結(jié)合起來(lái),便可說(shuō)明
            偽流的工作原理。發(fā)送端必須分別發(fā)送各自獨(dú)立的數(shù)據(jù)包,但接收端可以對(duì)收到的數(shù)據(jù)包自
            由組合。一般情況下,可把偽流視作一個(gè)普通的“面向流的協(xié)議”。


            5.1.2 面向連接和無(wú)連接
            通常情況下,一個(gè)協(xié)議提供面向連接的服務(wù),或提供無(wú)連接的服務(wù)。面向連接的服務(wù)中,
            進(jìn)行數(shù)據(jù)交換之前,必須與通信方建立一條路徑。這樣既確定了通信方之間存在路由,又保證了通信雙方都是活動(dòng)的、都可彼此響應(yīng),但其特點(diǎn)是在通信雙方之間建立一個(gè)通信信道需要很多開(kāi)支。除此以外,大部分面向連接的協(xié)議為保證投遞無(wú)誤,可能會(huì)因?yàn)閳?zhí)行額外的計(jì)算來(lái)驗(yàn)證正確性,因此,進(jìn)一步增加開(kāi)支。而無(wú)連接協(xié)議卻不保證接收端是否正在收聽(tīng)。無(wú)連接服務(wù)類似于郵政服務(wù):發(fā)信人把信裝入郵箱即可。至于收信人是否想收到這封信或郵局是否會(huì)因?yàn)楸╋L(fēng)雨未能按時(shí)將信件投遞到收信人處等等,發(fā)信人都不得而知。


            5.1.3 可靠性和次序性
            在設(shè)計(jì)用于特定協(xié)議的應(yīng)用程序來(lái)說(shuō),可靠性和次序性是我們必須了解的最具決定性的特性。大多數(shù)情況下,可靠性和次序性與協(xié)議是無(wú)連接的,還是面向連接的密切相關(guān)。

            5.1.4 從容關(guān)閉
            從容關(guān)閉只出現(xiàn)在面向連接的協(xié)議中。在這種關(guān)閉過(guò)程中,一方開(kāi)始關(guān)閉通信會(huì)話,但另一方仍然可以讀取線上或網(wǎng)絡(luò)堆棧上已掛起的數(shù)據(jù)。如果面向連接的協(xié)議不支持從容關(guān)閉,
            只要其中一方關(guān)閉了通信信道,都會(huì)導(dǎo)致連接立即中斷,數(shù)據(jù)丟失,接收端不能讀取數(shù)據(jù)這些情況出現(xiàn)。

            5.1.5 廣播數(shù)據(jù)
            廣播數(shù)據(jù)即數(shù)據(jù)從一個(gè)工作站發(fā)出,局域網(wǎng)內(nèi)的其他所有工作站都能收到它。這一特征
            適用于無(wú)連接協(xié)議,因?yàn)長(zhǎng) A N上的所有機(jī)器都可獲得并處理廣播消息。。一般情況下,路由器都不會(huì)傳送廣播包。 ?

            5.1.6 多播數(shù)據(jù)
            多播是指一個(gè)進(jìn)程發(fā)送數(shù)據(jù)的能力,這些數(shù)據(jù)即將由一個(gè)或多個(gè)接收端進(jìn)行接收。進(jìn)程加入一個(gè)多播會(huì)話的方法和采用的基層協(xié)議有關(guān)。視頻會(huì)議應(yīng)用常常使用多播。

            5.1.7 服務(wù)質(zhì)量
            服務(wù)質(zhì)量( Q o S)是應(yīng)用的一種能力,用以請(qǐng)求針對(duì)專門用途分配特定的帶寬。

            5.1.8 部分消息
            部分消息只用于面向消息的協(xié)議。

            5.1.9 路由選擇的考慮
            一個(gè)重要考慮就是協(xié)議是否可路由。如果協(xié)議可路由,就可在兩個(gè)工作站之間建立一條成功的通信路徑(要么是面向連接的回路,要么是數(shù)據(jù)報(bào)的數(shù)據(jù)路徑),不管這兩個(gè)工作站之間存在的網(wǎng)絡(luò)硬件是什么。路由器不對(duì)發(fā)自非路由協(xié)議的數(shù)據(jù)包進(jìn)行轉(zhuǎn)發(fā),即便數(shù)據(jù)包的既定目的地在其連接的子網(wǎng)上。

            5.2 支持的協(xié)議
            Wi n 3 2平臺(tái)提供的最有用的特征之一是能夠同步支持多種不同的網(wǎng)絡(luò)協(xié)議。
            利用Wi n s o c k編程接口的好
            處之一是因?yàn)樗且粋€(gè)與協(xié)議無(wú)關(guān)的接口。不管使用的是哪一種協(xié)議,它們的操作大多數(shù)是
            相通的。

            要想獲得系統(tǒng)中安裝的網(wǎng)絡(luò)協(xié)議的相關(guān)信息,調(diào)用這個(gè)函數(shù)W S A E n u m P r o t o c o l s即可,
            打開(kāi)Winsock在可以調(diào)用一個(gè)Wi n s o c k函數(shù)之前,必須先加載一個(gè)版本正確的Wi n s o c k庫(kù)。Wi n s o c k
            啟動(dòng)例程是W S A S t a r t u p,它的定義是:
            int WSAStartup(WORD wVe r s i o n R e q u e s t e d , L P W S A D ATA lpWSAData)
            第一個(gè)參數(shù)是準(zhǔn)備加載的Wi n s o c k庫(kù)的版本號(hào)。就目前的Wi n 3 2平臺(tái)而言,Winsock 2
            庫(kù)的最新版本是2 . 2。唯一的例外是Windows CE,它只支持Winsock 1.1版。如果需要
            Winsock 2.2版,指定這個(gè)值( 0 x 0 2 0 2)或使用宏M A K E W O R D ( 2 , 2 )即可。高位字節(jié)指定
            副版本,而低位字節(jié)則指定主版本。
            第二個(gè)參數(shù)是W S A D ATA結(jié)構(gòu),它是調(diào)用完成之后立即返回的。W S A D ATA包含了W S A S t a r t u p加載的關(guān)于Wi n s o c k版本的信息。
            大致說(shuō)來(lái),在W S A D ATA結(jié)構(gòu)中,返回的唯一有用的信息是w Ve r s i o n和w H i g h Ve r s i o n。
            屬于最大套接字和最大U D P長(zhǎng)度的條目應(yīng)該從自己正在使用的特定協(xié)議目錄條目中獲取。

            在結(jié)束Wi n s o c k庫(kù),而且不再需要調(diào)用任何Wi n s o c k函數(shù)時(shí),會(huì)卸載這個(gè)庫(kù),并釋放資源。這個(gè)函數(shù)的定義是:
            int WSACleanup (void);
            記住,每次調(diào)用W S A S t a r t u p,都需要調(diào)用相應(yīng)的W S A C l e a n u p,因?yàn)槊看螁?dòng)調(diào)用都
            會(huì)增加對(duì)加載Winsock DLL的引用次數(shù),它要求調(diào)用同樣多次的W S A C l e a n u p,以此抵消
            引用次數(shù)。

            5.4 Windows套接字

            。所謂套接字,就是一個(gè)指向傳輸提
            供者的句柄。Wi n 3 2中,套接字不同于文件描述符,所以它是一個(gè)獨(dú)立的類型—S O C K E T。
            套接字是由兩個(gè)函數(shù)建立的:
            SOCKET WSASocket(int af,
            ???????? int type,
            ???????? int protocol,
            ???????? LPWSAPROTOCOL_INOF lpProtocolInfo,
            ???????? GROUP g,
            ???????? DWORD dwFlag
            ???????? );
            SOCKET socket(int af,
            ???????int type,
            ???????int protocol
            ???????);
            第一個(gè)參數(shù)a f,是協(xié)議的地址家族。比如,如果想建立一個(gè)U D P或T C P套接字,可用常量A F _ I N E T來(lái)指代互聯(lián)網(wǎng)協(xié)議( I P)。
            第二個(gè)參數(shù)t y p e,是協(xié)議的套接字類型。套接字的類型可以是下面五個(gè)值:
            ?S O C K _ S T R E A M、S O C K _ D G R A M、S O C K _ S E Q PA C K E T、S O C K _ R AW和S O C K _ R D M。
            第三個(gè)參數(shù)是p r o t o c o l。指定的地址家族和套接字類型有多個(gè)條目時(shí),就可用
            這個(gè)字段來(lái)限定使用特定傳輸。

            最后兩個(gè)W S A S o c k e t標(biāo)志很簡(jiǎn)單。組參數(shù)始終為0,因?yàn)槟壳吧袩o(wú)可支持套接字組的
            Wi n s o c k版本。要指定一個(gè)或多個(gè)下列標(biāo)志,可用d w F l a g s參數(shù):
            ■ W S A _ F L A G _ O V E R L A P P E D
            ■ W S A _ F L A G _ M U LT I P O I N T _ C _ R O O T
            ■ W S A _ F L A G _ M U LT I P O I N T _ C _ L E A F
            ■ W S A _ F L A G _ M U LT I P O I N T _ D _ R O O F
            ■ W S A _ F L A G _ M U LT I P O I N T _ D _ L E A F
            第一個(gè)標(biāo)志W(wǎng) S A _ F L A G _ O V E R L A P P E D,用于指定這個(gè)套接字具備重疊I / O(是適用于
            Wi n s o c k的可能實(shí)現(xiàn)的通信模式之一)。這個(gè)主題將在第8章詳細(xì)討論。調(diào)用s o c k e t建立一個(gè)套
            接字時(shí), W S A _ F L A G _ O V E R L A P P E D便是默認(rèn)設(shè)置。一般說(shuō)來(lái),在使用W S A S o c k e t時(shí),最好
            始終保持設(shè)定該標(biāo)志。后面四個(gè)標(biāo)志用于處理多播套接字。


            原始套接字
            利用W S A S o c k e t建立套接字時(shí),可向函數(shù)調(diào)用傳送一個(gè)W S A P R O TO CO L _ I N F O結(jié)構(gòu),以
            定義準(zhǔn)備建立的那個(gè)套接字的類型;盡管如此,還是可建立一些套接字類型(在傳輸提供者
            目錄中,它們沒(méi)有相應(yīng)的條目)。最佳示例是I P協(xié)議下的原始套接字。原始套接字一種通信,
            允許你把其他協(xié)議封裝在U D P數(shù)據(jù)包中,比如說(shuō)“互聯(lián)網(wǎng)控制消息協(xié)議”(I C M P)。I C M P的
            目的是投遞互聯(lián)網(wǎng)主機(jī)間的控制、錯(cuò)誤和信息型消息。由于I C M P不提供任何數(shù)據(jù)傳輸功能,
            因此不能把它與U D P或T C P同等看待,但它和I P本身屬于同一個(gè)級(jí)別。

            Winsock API安裝在“會(huì)話層”和“傳送層”之間。

            5.6 選擇適當(dāng)?shù)膮f(xié)議
            T C P / I P就是首選協(xié)議之一,至少?gòu)闹С帜芰臀④浀馁澲@一角度來(lái)看,是
            這樣的

            5.7 小結(jié)
            通過(guò)本章的學(xué)習(xí),大家已了解為應(yīng)用程序選擇網(wǎng)絡(luò)傳輸時(shí)應(yīng)該知道的基本特性。在為指100計(jì)計(jì)第二部分附Winsock API
            下載定的協(xié)議開(kāi)發(fā)成功的網(wǎng)絡(luò)應(yīng)用程序時(shí),了解這些特性是至關(guān)重要的。我們還有計(jì)劃地深入探討了如何獲得安裝在系統(tǒng)中的傳輸提供者列表和如何查詢特定屬性。最后,我們還學(xué)習(xí)了如何為指定的傳輸建立套接字,方法是為W S A S o c k e t或s o c k e t函數(shù)指定正確的參數(shù),再利用
            W S A E n u m P r o t o c o l s查詢目錄條目以及通過(guò)W S A P R O TO C O L _ I N F O結(jié)構(gòu),把函數(shù)投遞到W S A S o c k e t。下一章,我們將進(jìn)一步探討各主要協(xié)議的定址方法。

            ?

            Posted on 2006-09-06 19:00 艾凡赫 閱讀(430) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程
            亚洲国产成人久久综合一 | 色偷偷偷久久伊人大杳蕉| 欧美777精品久久久久网| 久久精品日日躁夜夜躁欧美| 精品久久久久久久久久中文字幕 | 一本色道久久88综合日韩精品 | 韩国三级大全久久网站| 韩国免费A级毛片久久| 伊人热人久久中文字幕| 欧美精品国产综合久久| 色婷婷久久综合中文久久蜜桃av| 久久中文字幕视频、最近更新| 久久激情五月丁香伊人| 国产精品久久久久一区二区三区| 漂亮人妻被黑人久久精品| 91精品国产综合久久久久久| 久久青青草原精品影院| 久久综合九色欧美综合狠狠| 久久精品久久久久观看99水蜜桃| 伊人久久大香线蕉亚洲| 久久精品无码一区二区无码 | 9久久9久久精品| 久久亚洲AV成人无码软件| 丁香久久婷婷国产午夜视频| 婷婷伊人久久大香线蕉AV| 一本久久精品一区二区| 一本一道久久精品综合| 国内精品人妻无码久久久影院 | 久久丝袜精品中文字幕| 青青国产成人久久91网| 99精品久久精品一区二区| 2021国产精品久久精品| 一本色综合久久| 亚洲国产一成久久精品国产成人综合 | 新狼窝色AV性久久久久久| 热久久视久久精品18| 亚洲国产成人乱码精品女人久久久不卡| 久久精品一区二区国产| 国产精品一区二区久久| 久久精品亚洲中文字幕无码麻豆| 亚洲综合熟女久久久30p|