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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

            要想獲得系統(tǒng)中安裝的網(wǎng)絡(luò)協(xié)議的相關(guān)信息,調(diào)用這個函數(shù)W S A E n u m P r o t o c o l s即可,
            打開Winsock在可以調(diào)用一個Wi n s o c k函數(shù)之前,必須先加載一個版本正確的Wi n s o c k庫。Wi n s o c k
            啟動例程是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)
            第一個參數(shù)是準(zhǔn)備加載的Wi n s o c k庫的版本號。就目前的Wi n 3 2平臺而言,Winsock 2
            庫的最新版本是2 . 2。唯一的例外是Windows CE,它只支持Winsock 1.1版。如果需要
            Winsock 2.2版,指定這個值( 0 x 0 2 0 2)或使用宏M A K E W O R D ( 2 , 2 )即可。高位字節(jié)指定
            副版本,而低位字節(jié)則指定主版本。
            第二個參數(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版本的信息。
            大致說來,在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長度的條目應(yīng)該從自己正在使用的特定協(xié)議目錄條目中獲取。

            在結(jié)束Wi n s o c k庫,而且不再需要調(diào)用任何Wi n s o c k函數(shù)時,會卸載這個庫,并釋放資源。這個函數(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)槊看螁诱{(diào)用都
            會增加對加載Winsock DLL的引用次數(shù),它要求調(diào)用同樣多次的W S A C l e a n u p,以此抵消
            引用次數(shù)。

            5.4 Windows套接字

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

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


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

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

            5.6 選擇適當(dāng)?shù)膮f(xié)議
            T C P / I P就是首選協(xié)議之一,至少從支持能力和微軟的贊助這一角度來看,是
            這樣的

            5.7 小結(jié)
            通過本章的學(xué)習(xí),大家已了解為應(yīng)用程序選擇網(wǎng)絡(luò)傳輸時應(yīng)該知道的基本特性。在為指100計計第二部分附Winsock API
            下載定的協(xié)議開發(fā)成功的網(wǎng)絡(luò)應(yīng)用程序時,了解這些特性是至關(guān)重要的。我們還有計劃地深入探討了如何獲得安裝在系統(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查詢目錄條目以及通過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 艾凡赫 閱讀(426) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程
            99久久99久久精品国产片果冻| 99久久国产宗和精品1上映| 九九精品99久久久香蕉| 91精品国产色综合久久| 国产精品女同一区二区久久| 久久青青草原精品国产软件| 国产精品乱码久久久久久软件| 久久精品国产亚洲av日韩 | 9191精品国产免费久久| 精品99久久aaa一级毛片| 天堂无码久久综合东京热| 久久永久免费人妻精品下载| 久久久久久国产a免费观看不卡| 99精品国产免费久久久久久下载| 99久久久精品免费观看国产| 久久人搡人人玩人妻精品首页| 精品永久久福利一区二区 | 尹人香蕉久久99天天拍| 99国产欧美精品久久久蜜芽| 亚洲国产成人久久精品99 | 老司机国内精品久久久久| 亚洲欧洲中文日韩久久AV乱码| 国产综合久久久久| 精品久久久久久中文字幕大豆网| 国产精品欧美久久久久无广告 | 久久精品aⅴ无码中文字字幕不卡| MM131亚洲国产美女久久| 久久99国产精品久久99小说| 国产成人久久精品二区三区| 国产精品99久久久久久人| 日本欧美久久久久免费播放网| 久久精品国产欧美日韩99热| 久久久久成人精品无码| 国内精品久久久久久不卡影院| 777米奇久久最新地址| 久久丫精品国产亚洲av不卡 | 久久综合色老色| 久久久精品久久久久影院| 久久精品免费全国观看国产| 亚洲色欲久久久久综合网| 无码人妻久久一区二区三区蜜桃 |