版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)報(bào)告 - 滑動(dòng)窗口協(xié)議仿 真作者:日期:滁州學(xué)院課程設(shè)計(jì)報(bào)告課程名稱:計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)題目 :滑動(dòng)窗口協(xié)議仿真系別 :計(jì)算機(jī)與信息工程學(xué)院專業(yè) :計(jì)算機(jī)科學(xué)與技術(shù)組 別:第五組起止日期 : 201 年11 月 24 日01年 1月 7 日指導(dǎo)教師:趙國(guó)柱計(jì)算機(jī)與信息工程學(xué)院二一一年制課程設(shè)計(jì)題目滑動(dòng)窗口協(xié)議仿真組長(zhǎng)趙育坤學(xué)號(hào)2011220135班級(jí)計(jì)專 1 班系別計(jì)算機(jī)與信息 工程學(xué)院專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)組員閆婷、張俠、余靜、于東鋒、張飛、趙育坤指導(dǎo)教師趙國(guó)柱課程設(shè)計(jì)目的掌握滑動(dòng)窗口協(xié)議的基本原理,并能夠用所學(xué)計(jì)算機(jī)高級(jí)語(yǔ)言進(jìn)行編程模擬課程設(shè)計(jì)所需環(huán)境開(kāi)發(fā)環(huán)境 : VC+運(yùn)行環(huán)境 : W
2、indows 操作系統(tǒng)課程設(shè)計(jì)任務(wù)要求1. 程序按照滑動(dòng)窗口協(xié)議實(shí)現(xiàn)端對(duì)端的數(shù)據(jù)傳送。 包括協(xié)議的各種 策略 ,如包丟失、停等應(yīng)答、超時(shí)等都應(yīng)有所仿真實(shí)現(xiàn)2顯示數(shù)據(jù)傳送過(guò)程中的各項(xiàng)具體數(shù)據(jù)。雙方幀的個(gè)數(shù)變化,幀序號(hào) ,發(fā)送和接受速度 ,暫?;蛑貍魈崾镜日n程設(shè)計(jì)工作進(jìn)度計(jì)劃序號(hào)起止日期工 作 內(nèi) 容分工情況111 月 24 號(hào)11月 27號(hào)了解工作要求, 明確分工內(nèi) 容, 網(wǎng)上查閱相關(guān)資料所有組員共同參與211 月 8 號(hào) 1 月30 號(hào)s nder 隊(duì)列模塊的編寫(xiě)由閆婷完成312 月 1 號(hào)12 月號(hào)en e主函數(shù)的編寫(xiě)由趙育坤、張飛完成11 月 28 號(hào)月30 號(hào)recei er 隊(duì)列模塊的
3、編寫(xiě)由張俠完成512月 1號(hào)12 月 4 號(hào)receiver 主函數(shù)的編寫(xiě)由余靜、于東鋒完成62月 5號(hào)月 7 號(hào)最后匯總 , 調(diào)試由趙育坤、于東鋒完成指導(dǎo)教師簽字: 年 月 日教研室審核意見(jiàn) :教研室主任簽字 :年月日課程設(shè)計(jì)任務(wù)書(shū)一 . 引言二. 基本原理2.1 窗口機(jī)制22 1 t 滑動(dòng)窗口協(xié)議 .3 后退協(xié)議2. 選擇重傳協(xié)議2 5 流量控制三 需求分析 .1 課程設(shè)計(jì)題目3.2 開(kāi)發(fā)環(huán)境3.3 運(yùn)行環(huán)境3 課程設(shè)計(jì)任務(wù)及要求3.5 界面要求3.6 網(wǎng)絡(luò)接口要求四. 詳細(xì)設(shè)計(jì)4. 結(jié)構(gòu)體的定義4.2 發(fā)送方的主要函數(shù)4.3 接受方的主要函數(shù)五. 源代碼5.1 發(fā)送方的主要代碼5.2 接
4、收方的主要代碼 六 調(diào)試與操作說(shuō)明致謝 參考文獻(xiàn) 課程設(shè)計(jì)的主要內(nèi)容. 引言早期的網(wǎng)絡(luò)通信中 , 通信雙方不會(huì)考慮網(wǎng)絡(luò)的擁擠情況直接發(fā)送數(shù)據(jù)。由于大家 不知道網(wǎng)絡(luò)擁塞狀況,一起發(fā)送數(shù)據(jù),導(dǎo)致中間結(jié)點(diǎn)阻塞掉包,誰(shuí)也發(fā)不了數(shù)據(jù)。在 數(shù)據(jù)傳輸過(guò)程中,我們總是希望數(shù)據(jù)傳輸?shù)母煲恍?,但如果發(fā)送方把數(shù)據(jù)發(fā)送的過(guò)快 , 接收方就可能來(lái)不及接收 , 這就造成數(shù)據(jù)的丟失。 因此就有了滑動(dòng)窗口機(jī)制來(lái)解決這些問(wèn) 題。早期我們使用的是 1b t 滑動(dòng)窗口協(xié)議,一次只發(fā)送一個(gè)幀,等收到 ack 確認(rèn)才 發(fā)下一個(gè)幀 , 這樣對(duì)信道的利用率太低了。 因此提出了一種采用累積確認(rèn)的連續(xù)ARQ協(xié)議 ,接收方不必對(duì)收到的幀逐個(gè)發(fā)
5、送 ack 確認(rèn), 而是收到幾個(gè)幀后,對(duì)按序到達(dá)的最后一個(gè)幀發(fā) 送 ck 確認(rèn)。同 1bit 滑動(dòng)窗口協(xié)議相比 , 大大減少了 a數(shù)量,并消除了延遲 a k 對(duì)傳 輸效率的影響。 但是 , 這會(huì)產(chǎn)生一個(gè)新的問(wèn)題, 如果發(fā)送方發(fā)送了 5 個(gè)幀 , 而中間的第 3 個(gè)幀 丟失了。 這時(shí)接收方只能對(duì)前 2 個(gè)幀發(fā)出確認(rèn)。 發(fā)送方無(wú)法知道后面三個(gè)幀的下落, 只好把 后面的個(gè)幀再重傳一次, 這就是回退 N協(xié)議。為了解決這個(gè)問(wèn)題 , 又提出了選擇重傳協(xié)議。 當(dāng)接收方發(fā)現(xiàn)某幀出錯(cuò)后,繼續(xù)接受后面送來(lái)的正確的幀,只是不交付它們,存放在 自己的緩沖區(qū)中 , 并且要求發(fā)送方重傳出錯(cuò)的那一幀。 一旦收到重傳來(lái)的幀后
6、 , 就可以 將存于緩沖區(qū)中的其余幀一并按正確的順序遞交給主機(jī)。2. 基本原理2 窗口機(jī)制滑動(dòng)窗口協(xié)議的基本原理就是在任意時(shí)刻,發(fā)送方都維持了一個(gè)連續(xù)的允許發(fā)送的 幀的序號(hào),稱為發(fā)送窗口 ; 同時(shí) , 接收方也維持了一個(gè)連續(xù)的允許接收的幀的序號(hào) , 稱為 接收窗口。發(fā)送窗口和接收窗口的序號(hào)的上下界不一定要一樣,甚至大小也可以不同。 不同的滑動(dòng)窗口協(xié)議窗口大小一般不同。發(fā)送方窗口內(nèi)的序號(hào)代表了那些已經(jīng)被發(fā)送, 但是還沒(méi)有被確認(rèn)的幀,或者是那些可以被發(fā)送的幀。接受方為其窗口內(nèi)的每一個(gè)序號(hào)保 留了一個(gè)緩沖區(qū)。與每個(gè)緩沖區(qū)相關(guān)聯(lián)的還有一位 , 用來(lái)指明該緩沖區(qū)是滿的還是空的。 ? 若從滑動(dòng)窗口的觀點(diǎn)來(lái)
7、統(tǒng)一看待比特滑動(dòng)窗口、后退 n 及選擇重傳三種協(xié)議 , 它們的 差別僅在于各自窗口尺寸的大小不同而已。 1比特滑動(dòng)窗口協(xié)議 : 發(fā)送窗口 =1,接收窗口 =1; 后退協(xié)議 : 發(fā)送窗口 1,接收窗口 =1;選擇重傳協(xié)議:發(fā)送窗口, 接收窗口 。2.2 1bit 滑動(dòng)窗口協(xié)議當(dāng)發(fā)送窗口和接收窗口的大小固定為時(shí),滑動(dòng)窗口協(xié)議退化為停等協(xié)議( stop- nd a t) 。該協(xié)議規(guī)定發(fā)送方每發(fā)送一幀后就要停下來(lái), 等待接收方已正確接收的確認(rèn) (ackno led ement )返回后才能繼續(xù)發(fā)送下一幀。由于接收方需要判斷接收到的 幀是新發(fā)的幀還是重新發(fā)送的幀 , 因此發(fā)送方要為每一個(gè)幀加一個(gè)序號(hào)。由
8、于停等協(xié)議規(guī)定只有一幀完全發(fā)送成功后才能發(fā)送新的幀 方和接收方運(yùn)行的流程圖如圖所示。, 因而只用一比特來(lái)編號(hào)就夠了。其發(fā)送發(fā)送方接收方大大降低了信道利用23 后退 N 協(xié)議由于停等協(xié)議要為每一個(gè)幀進(jìn)行確認(rèn)后才繼續(xù)發(fā)送下一幀,率,因此又提出了后退協(xié)議。后退n 協(xié)議中,發(fā)送方在發(fā)完一個(gè)數(shù)據(jù)幀后, 不停下 來(lái)等待應(yīng)答幀 ,而是連續(xù)發(fā)送若干個(gè)數(shù)據(jù)幀 , 即使在連續(xù)發(fā)送過(guò)程中收到了接收方發(fā) 來(lái)的應(yīng)答幀 , 也可以繼續(xù)發(fā)送。且發(fā)送方在每發(fā)送完一個(gè)數(shù)據(jù)幀時(shí)都要設(shè)置超時(shí)定時(shí) 器。只要在所設(shè)置的超時(shí)時(shí)間內(nèi)仍收到確認(rèn)幀,就要重發(fā)相應(yīng)的數(shù)據(jù)幀。如:當(dāng)發(fā)送 方發(fā)送了個(gè)幀后 , 若發(fā)現(xiàn)該 N 幀的前一個(gè)幀在計(jì)時(shí)器超時(shí)后
9、仍未返回其確認(rèn)信息,N 幀。則該幀被判為出錯(cuò)或丟失 , 此時(shí)發(fā)送方就不得不重新發(fā)送出錯(cuò)幀及其后的 從這里不難看出,后退 n 協(xié)議一方面因連續(xù)發(fā)送數(shù)據(jù)幀而提高了效率 , 但另一方 面,在重傳時(shí)又必須把原來(lái)已正確傳送過(guò)的數(shù)據(jù)幀進(jìn)行重傳(僅因這些數(shù)據(jù)幀之前有 一個(gè)數(shù)據(jù)幀出了錯(cuò)) , 這種做法又使傳送效率降低。由此可見(jiàn),若傳輸信道的傳輸質(zhì)2.4 選擇重傳協(xié)議的正確的幀雖然不能立即遞交給接收方的高層, 但接收方仍可收下來(lái),存放在一個(gè)緩沖在后退 n 協(xié)議中,接收方若發(fā)現(xiàn)錯(cuò)誤幀就不再接收后續(xù)的幀, 即使是正確到達(dá)的幀,, 其后繼續(xù)送來(lái)這顯然是一種浪費(fèi)。另一種效率更高的策略是當(dāng)接收方發(fā)現(xiàn)某幀出錯(cuò)后區(qū)中,同時(shí)要
10、求發(fā)送方重新傳送出錯(cuò)的那一幀。一旦收到重新傳來(lái)的幀后 , 就可以原已S LE T, 但要求接收方有存于緩沖區(qū)中的其余幀一并按正確的順序遞交高層。這種方法稱為選擇重發(fā)( CE E E T), 其工作過(guò)程如圖所示。顯然,選擇重發(fā)減少了浪費(fèi) 足夠大的緩沖區(qū)空間。2. 流量控制TCP 的特點(diǎn)之一是提供體積可變的滑動(dòng)窗口機(jī)制,支持端到端的流量控制。 TCP 的窗口以字節(jié)為單位進(jìn)行調(diào)整 , 以適應(yīng)接收方的處理能力。處理過(guò)程如下 :(1)TCP連接階段,雙方協(xié)商窗口尺寸,同時(shí)接收方預(yù)留數(shù)據(jù)緩存區(qū);( 2)發(fā)送方根據(jù)協(xié)商的結(jié)果,發(fā)送符合窗口尺寸的數(shù)據(jù)字節(jié)流,并等待對(duì)方的確認(rèn);(3)發(fā)送方根據(jù)確認(rèn)信息,改變窗口
11、的尺寸, 增加或者減少發(fā)送未得到確認(rèn)的字節(jié)流中的字節(jié)數(shù)。調(diào)整過(guò)程包括 : 如果出現(xiàn)發(fā)送擁塞 ,發(fā)送窗口縮小為原來(lái)的一半, 同時(shí)將超時(shí)重傳的時(shí)間間隔擴(kuò)大一倍。( 4)滑動(dòng)窗口機(jī)制為端到端設(shè)備間的數(shù)據(jù)傳輸提供了可靠的流量控制機(jī)制。然而, 它只能在源端設(shè)備和目的端設(shè)備起作用,當(dāng)網(wǎng)絡(luò)中間設(shè)備 (例如路由器等 ) 發(fā)生擁塞 時(shí),滑動(dòng)窗口機(jī)制將不起作用。3. 需求分析3. 課程設(shè)計(jì)題目:滑動(dòng)窗口協(xié)議仿真. 開(kāi)發(fā)環(huán)境 : isual C+ 6.03.3 運(yùn)行環(huán)境: W dows 操作系統(tǒng).4 課程設(shè)計(jì)任務(wù)及要求 :(1) 程序按照滑動(dòng)窗口協(xié)議實(shí)現(xiàn)端對(duì)端的數(shù)據(jù)傳送。包括協(xié)議的各種策略,如包丟失、停 等應(yīng)答、超
12、時(shí)等都應(yīng)有所仿真實(shí)現(xiàn)。 ? ( 2)顯示數(shù)據(jù)傳送過(guò)程中的各項(xiàng)具體數(shù)據(jù)。雙方幀 的個(gè)數(shù)變化 , 幀序號(hào),發(fā)送和接受速度,暫停或重傳提示等。3.5 界面要求:此次課程設(shè)計(jì)要求的所有功能應(yīng)可視 , 我們組主要是用 V +編寫(xiě)的, 運(yùn)行在 DOS環(huán)境 下, 觀察發(fā)送方 (sender) 發(fā)送數(shù)據(jù)包到接收方 (rec ive) 時(shí)。界面應(yīng)顯示出雙方幀個(gè)數(shù)的變 化, 幀序號(hào),發(fā)送和接受速度 ,暫?;蛑貍魈崾镜?, 界面中必須動(dòng)態(tài)顯示數(shù)據(jù)幀的發(fā)送和接受 情況 ,包括在相應(yīng)的窗口詳細(xì)顯示相應(yīng)的 CK和其他收發(fā)數(shù)據(jù)幀后發(fā)出的消息, 以表明模擬協(xié)議的正確運(yùn)作過(guò)程。 在各種情況下, 接受方和發(fā)送方窗口應(yīng)實(shí)時(shí)顯示幀的
13、發(fā)送和接受情況, 包括序號(hào) , 時(shí)間戳,內(nèi)容等。以及窗口的填充和清空情況。3.6 網(wǎng)絡(luò)接口要求 :接收數(shù)據(jù)的端口初始應(yīng)為監(jiān)/幀類型兩臺(tái)機(jī)器或是一臺(tái)機(jī)器中兩個(gè)獨(dú)立的線程模擬發(fā)送方與接受方, 聽(tīng)狀態(tài)。發(fā)送方向接受方發(fā)起連接,成功后開(kāi)始發(fā)送數(shù)據(jù)。4. 概要設(shè)計(jì).1 結(jié)構(gòu)體定義如下:type f enu dta = 1,ack,nak, out rae ind;yp ef str ct fr m _hearme_ i i d; /幀類型 signed int s ; /序列號(hào)u sig ed i t ack; /確認(rèn)號(hào)unined char a MAX L N TH; /數(shù)據(jù)H ad;y edef s
14、truct fram frame ead ead; /幀頭 nsigne i t siz; /數(shù)據(jù)的大小 Fr e;t pde tu t fr meode /隊(duì)列節(jié)點(diǎn)類型 a head_da a;str ct m nod * ext; rme de; pede struc ra enode * t; /隊(duì)頭指針 rameode *rear ;/隊(duì)尾指針 LinkQue ;4.2 發(fā)送方的主要函數(shù)實(shí)現(xiàn) : 函數(shù)名: vod I t ine(LinkQueue *q ) ; ? 功 能:初始化隊(duì)列。函數(shù)名 :v id tFrameFrom ost(Lin Qeue *);功 能:從主機(jī)取數(shù)據(jù)幀 ,
15、由于實(shí)驗(yàn)需要,假設(shè)主機(jī)有足夠多的數(shù)據(jù)幀要發(fā)送。 voi eL n( inkQueue *q); ?功 能:數(shù)據(jù)幀發(fā)送完畢 (收到確認(rèn)幀)后,刪除發(fā)送的數(shù)據(jù)幀(隊(duì)頭 )。函數(shù)名 :int QueueEmpty( kQueue ); ?功 能:判斷隊(duì)列是否為空。函數(shù)名 :f ame Q eueF on( LnkQeue ) ;功 能 :取隊(duì)頭,首幀是準(zhǔn)備好待發(fā)送的幀。函數(shù)名 :in QueueLe(Li kQueue *q);功 能:計(jì)算隊(duì)列長(zhǎng)度。函數(shù)名 :DW RD NAPI Rec ive n(LP O D pAr ); 功 能:發(fā)送線程調(diào)用的函數(shù) ,pArg 參數(shù)存接收幀指針。 函數(shù)名: v
16、oid main() ;功 能:發(fā)送方主函數(shù),首先和接收方(本機(jī) 12.0.1)建立 ket 連接并初始化發(fā)送 隊(duì)列。然后重復(fù)下面的步驟 :(1)從主機(jī)取數(shù)據(jù)幀;(2)發(fā)送數(shù)據(jù)幀,含超時(shí)重發(fā)(接收方未收到或未收到接收方ack)和錯(cuò)誤重發(fā) (收到接收方 n);()設(shè)置超時(shí)計(jì)時(shí)器,這里是 5 秒;( 4)等待確認(rèn),調(diào)用 Cre teThread() 函數(shù)創(chuàng)建一個(gè)線程 ,超時(shí)則調(diào)用 Ter inateT r ad() 函數(shù)結(jié)束線程并再次發(fā)送數(shù)據(jù)幀。收到數(shù)據(jù)幀則做后續(xù)處理;(5)收到否認(rèn)幀 na則再次發(fā)送數(shù)據(jù)幀 ,收到確認(rèn)幀 a k 則發(fā)送下一個(gè)數(shù)據(jù)幀 ; (6)如果發(fā)送的測(cè)試時(shí)間達(dá)到 0 秒,則提示
17、是否繼續(xù)測(cè)試 ,按 q或退出測(cè)試。4.3 接收方的主要函數(shù)實(shí)現(xiàn): 函數(shù)名: od IiLi ( L k uee *q); 功 能 :初始化隊(duì)列。函數(shù)名 :void et a eFromHost( LinkQu ue *q);功 能:準(zhǔn)備好接收幀的緩沖池,首幀是待接收的幀 , 尾幀是已經(jīng)接收的待提交主機(jī)的幀。 由于實(shí)驗(yàn)需要 ,假設(shè)數(shù)據(jù)幀送往主機(jī)是足夠快的。int Line(Li Queue q, ram p, un ed nt cuw) 功 能:將幀數(shù)據(jù)保存供提交主機(jī), c rw 是打開(kāi)的待接收數(shù)據(jù)的窗口。函數(shù)名: t QueueEmpty(Lin Queue *q ) ;功 能:判斷隊(duì)列是否為
18、空。函數(shù)名 : t QeueLe(inkQue e q); 功 能:計(jì)算隊(duì)列長(zhǎng)度。函數(shù)名: oid a n();功 能 :接收方主函數(shù),首先和發(fā)送方建立soc t 連接并初始化初始化接收窗口。然后重復(fù)下面的步驟 :(1)等待 ,接收數(shù)據(jù)幀;()校驗(yàn)數(shù)據(jù)幀,假定產(chǎn)生隨機(jī)結(jié)果,%的概率校驗(yàn)錯(cuò)誤或發(fā)送方發(fā)送數(shù)據(jù)幀超時(shí);(3) 校驗(yàn)錯(cuò)誤時(shí) ,丟棄數(shù)據(jù)幀 ,并發(fā)送否認(rèn)幀 nak;(4) 如果出現(xiàn)接收超時(shí)(假定未收到發(fā)送方發(fā)送的數(shù)據(jù)幀),則不給發(fā)送發(fā)任何回應(yīng);(5) 如果校驗(yàn)正確,首先判斷是否是上一幀的重發(fā)。是上一幀的重發(fā),則丟棄數(shù)據(jù)幀,并發(fā) 送確認(rèn)幀 ac;是新的數(shù)據(jù)幀,則保存數(shù)據(jù)幀到當(dāng)前接收窗口,并發(fā)
19、送確認(rèn)幀ck。(6) 送數(shù)據(jù)幀至主機(jī)。5. 源代碼 1 發(fā)送方的主要代碼 :vid I itLine(L kQ eu *q)? - r t = q ear = NULL ;i t QueueEmpty(LinkQue e *q)rtun q-fro t = NUL & q-re r = NUL;fram QueueFro t( Lin Queu q)if (Qu ue mp y ( q)pr tf( 隊(duì)列為空! n);Slep(SLEPS);x t(0);re urn -front- ea_dta;int Q eueLe( LinkQ ee *q)?f (Q ue m y(q)?re u 0;
20、int n m ; r me ode p = q ront ;?while(p != NULL)?um+ ;?p p-n xt;? et rn num;vo d GetFrameFr mHost( inkQue *q)? (QueueL n( q) = MA POO)?p intf(da a %d 已準(zhǔn)備好 , q-front- head_ at.hea .seq);r ur ;? m ode *p=( am ode *)mal o (siz f(Fa e ode);?memset(p- he d d ta. ead.data, 0, AX_LENG );s d( unsig d)t me(N
21、ULL ) ;paddaasize = ad() % MAX_LENGTH; / 幀大小隨機(jī)生成?m m et(p hea _ata a da a, 1, p- ead_ a a.size);phe_data.hed.ak = -1; e daa.head.kid =da a; ?-ha_dt.hea.s = 0;?p nex = LL;i (QueueEm y(q)q-fro t = - ar=p; / 首幀是待發(fā)送的幀 ls?p- h ad_data. ead.s q = ( -re r h ad_dat .he seq + 1)%M XOO ;?- r ar- nxt =p;? q-re
22、ar =p ;?print (從主機(jī)得到 :da d,放入緩存 , p he d_data hea . eq); Frmeromos() ; / 由于實(shí)驗(yàn)需要 ,假設(shè)主機(jī)有足夠多的數(shù)據(jù)幀要發(fā)送oi DeLi e( inkQueue *q)?Framenode * N LL; f( ueEpty(q) )?prin f( 隊(duì)列為空! n);? e?p = q- o t;?q fr nt = - ex ;?if ( rearp)q- ear = NULL;?ri f(發(fā)送 dat %d, %d 成功!從緩存中刪除 n, p-hea _ a . a.s q, p-head_da a.siz);fre
23、() ;? = NULL ;vo d main() rin f( 建立連接 . n);Begin:?ORD w e sion estd; A ATA w aDat ; /初始化 socke庫(kù)? Ver onReqested EWORD(1,1 ); /兩個(gè) yte型合并成一個(gè) WORD 型in err= ASt rt p( wVersi n eqused, wsa at) ;?i( er !=0)? ee (S EEPM );return;? ( LOBY ( wsDa awV r n ) != | HIBYTE( wsaDat . Ver on ) ! = 1 ) A e nup();/中止
24、 ind ws Sock ts服務(wù) WSAStartu ( )成對(duì)使用Sleep(SLEEP S); et r ;?sckeClent = s ket(F_IT,OCK_STREM,0);/監(jiān)聽(tīng)的套接字?SOCKAD _IN clietd ;client dd.si _a _un.S_ r = inet_addr(1 70. .1 ); c ienta .sin fa i y = AF_ NET ; lien dd. in or = htons(700 ); 設(shè)置連接端的 IP、端口i ( OCK T_E OR= onn t(soc eC et,(SO KADDR* ) &c i ntdKAD
25、DR) ) / 連接?WS Clea up();Sleep(LEEPMS);?oto eg ;har g tDat RE IVE_MAX_LEN ;?memse(ge aa, 0, EEIE_MA _LENGTH); /清零? f( r cv( cktCiet,getata,REIVE_MA L GTH ,0) = OR) /接受pinf( 接受連接提示信息出錯(cuò)! );elsp ,geData);?char edataEND_ AX_LENGTH;?mem et(sen Data, , SEN M X_LE GTH);stcpy(endDat, 你好接收方,我是發(fā)送方 !);sizeof( O
26、 SOCKET_ER( sendDa?if( OCKET_ RROR = s nd( cketCl ent,sedDta, l )+1,0) ) /發(fā)送printf( 發(fā)送連接提示信息出錯(cuò) !n);?WS Cl nup() ;? closes ck t( socke Clie t);Sleep(SLE MS);re rn;printf( 按任意鍵繼續(xù)! n);?hile (! it() ; /等待開(kāi)始?Slep(SLEE S);?pinf(1b t 滑動(dòng)窗口協(xié)議 :發(fā)送方,發(fā)送窗口 =1n);?L n Q eu Que Q;?InitLine( QueueQ);?frame a ket nd;
27、 /d rame acketreceive; / ac ,n k?unsigned long tick = etT ckCount(); nt r ;HAND hThr ;?wh (1)?G tFraeFro H st( ueuQ);?/從主機(jī)取數(shù)據(jù)幀m ms t(&p cketsen, , si o(pake end) ;? Sle ( LEEPMS);?pri (n ) ;?p cke end = Qu eFron (&Q e eQ); /取數(shù)據(jù)幀0);/ 發(fā)送?ret = sn(socket let, (car *)&packetsend, siz f(pack ts nd), data
28、?f(ret = SOCKET_ OR)? ?rintf( 發(fā)送數(shù)據(jù)出錯(cuò) !n ) ;? ontin e;?ri tf(發(fā)送數(shù)據(jù)幀 :data %, %d , aketsend h d e, pace s d. iz);?const u sig ed long ti eOut = 5 * 1000; / 設(shè)置超時(shí)計(jì)時(shí)器5 秒超時(shí)?emset(&pcktreceive, 0, si eof(pac e ecei e);?Sleep(SLEEPMS);prin (n);?niliz itic Se i( &g );/ 初始化臨界區(qū)?hThread= e ehra(N L, 0, ReceieFun
29、, ( LP ID)&pa k tr ceive, 0, N L ); ?int W tFoMultipleObj cts(1, &h read, TRUE, meut);? DeetCrticalSection(&gCS ); /與 In a e ritica Secti ( & C); 成對(duì)使用i(et = CKE _E ROR | rt = SOC ET_DI CON )?prin f( 接受出錯(cuò) !Press any key o conti n) ;?while (!kbhi () ;? ?continue ;?f(r WAWIT_TMEOUT) / 判斷超時(shí)?TrmiaeT ead(
30、 Th ea, 0); / 終止線程? ? intf ( 超時(shí)重傳 :da a d, dn, pac ets nd.head.seq,packetsend.size) ;?else f( cket end.head. eq = pa eceive.headack)? and(nsined)tim (NULL) );?switc ( r( ) % 5) /假定產(chǎn)生隨機(jī)結(jié)果 ,20%的概率超時(shí)?cas 0 :?printf( 接收方發(fā)送回復(fù)超時(shí)( ak 丟失模擬) :% , acketsend. ea seq);? ?prin (超時(shí)重傳 :data %d, % , p ck tse d.heae
31、, acketse dsz);? ?b e k;? defaul :? (pa etr iv .head kind = ac )?pri tf( 接受 ack 幀:ack n, p c etreceiv .h ad ack)?DeLine( QueueQ);?else if(pac etr eiv .head.kin = nak)?pr ntf ( 接受幀 :nak n, ack tse d he s q)? k;? ? se pri ( 幀序號(hào)出錯(cuò):%dn, pac etreceiv . ead.ack);i(GtTickC un() t 2 * TIME UT) /設(shè)置時(shí)間 2秒? pri
32、ntf( 持續(xù)時(shí)間 s. 按 q 退出 ,其他鍵繼續(xù) n) ;int kbc = ge ch();?if( bc = q | c = Q )reak;?p in (按任意鍵退出 !n); hile (!kbhit() ) ;Seep(SLEPS);?print (謝謝使用 ! n);? ACleanup();?cossocket(sckeC ie t);?Sleep( SLE PMS) ;DWR INP Recei eFun(LPVOID r) nterCri ic ection(&gCS );進(jìn)入 cri cal sectionfrm *packetrec e = (frame *)pArg
33、 ;?e r cv( ocketC ient, (car *)pack r eive, si f(*p ket eceiv ), );?LevCiticalSecin(&CS); /線程用畢,離開(kāi) cri ca ectio return ret;5.2 接收方的主要代碼:vid InitLine ( ink uue *q)? fro t = qer UL;int QueueEmpty(Lin Qu u q)? eturn q-front = UL & - ear = NULL; ae QeueFont(Lnk ue *q)i (Queu Empt( ) r t (隊(duì)列為空! );? Sle p
34、(SL PMS); it(0) ;?r urn q-front- hed_ ta;nt Que Len ( in Queue *q)i (Queuempt ( )? urn 0 ;int n m = 0;?Fr menode *p = q- ront;?whle(p != NULL)? n m+;p = p-nex ;rtrn num;int G tF a eFromHost (LinkQueue * ) f(QueueL n() AXPOOL)? nf(準(zhǔn)備接受: da %d n, q-ron-ha_dt ead.seq); ? retun -f on - ead_data h a.seq;
35、?Fra enode *p=(Fr men de *)ma l (sieof( amende);? emset(p h ad_ at . d. t, 0, AX LENGT );p- h d at hea.a k = ;?p- ea _data.ead kin = ack;?p hea _ at . d e = 0; -ne t =NULL;?i(Qu u p( )q-front = q ear=p;? se?p-hea _d ta.h a se = (q- ar he d_data.ead.seq + 1)% AXPOO ;? -r ar-next =p;? -r ar = p;?retur
36、 et rameF m st(q);int D Li e(L k ueu *, fa *pf, nsigne it u) /假設(shè)數(shù)據(jù)幀 送往主機(jī)是足夠快的F m n de p = NULL;i(ur = q- o t- add ta. ead.se)? = -fr nt;else? q-r r;? f(p-h ad_ a a.h ad.ck ! -1) /假定數(shù)據(jù)已經(jīng)提交主機(jī)p ntf( 向主機(jī)交付 ata d, % 成功! n, p head_dat .had.ac, -h a data. i e) ; emse (p-head data.he d data, 0, M _L NGTH);
37、e cpy( p- head data.head.da , pf- e d. a a, - size);? -head ata. ize = -s ze;?p- ad_datahad c = f- h ad.se ; 保存發(fā)送幀序號(hào)?re urn p-he d_daa.head.seq;frame QueeAnwer(LnkQeu q, n gned in urw)?i(uw = qrt-hed ata head.s q)?retun q- ront-h ad_data;?le ?retu n -r ar- ad_ at ;o m n( )egin:WRD Versi n eq s d;SDA
38、TA wsaD ta; 初始化 so ke庫(kù)wVrioneqesd = MAK WORD( 1 , 1 ); 兩個(gè) e型合并成一個(gè) O D 型in er = W A tartup( wV ersionRe uested, wsa a );/ 使用 sockets 之前 要調(diào)用一次 f ( err ! = 0 )Sl ep( EPM );return;?if ( LOBYT ( wsa ata.w ersion ) ! 1 HIYTE ( wsa a wVersi n ) != )WSACle up() ;/中止 Wind Sockets服務(wù) WSA tartu()成對(duì)使用?Seep(S EPM
39、S) ;rtr;OKET socksr = socket(AF_NE,SOCK_STEAM,0) ;/監(jiān)聽(tīng)的套接字SC ADDR I s cke add; ock t d in_adr S un S adr ht nl( NA DR_ANY); / 監(jiān)聽(tīng)連socke add.sn_ mi y = F_INET; ocke add.s n_ ot = ons(7001);/設(shè)置端口 in (sock rv,(SOK DDR* ) ck tadd,size?if ( S ET_ROR = f(SOC ADDR) )prinf(綁定出錯(cuò)! n );?WSA le nup();Slep(SLEM);
40、e rn;if( SOCKET ROR =isten(ocksr ,5) )prntf( 監(jiān)聽(tīng)出錯(cuò) !);?WSA leanup() ;?S e ( EP S);r turn;SOKDDR N socciet;in en = sizeof(SO KA D);SOC ET sockcnn = cce t(socksrv,(SOC ADD *)&sockcli nt,&len) ; /建立連 接的套節(jié)字if(INVAL D_ O KET = ckconn )ri tf(建立連接出錯(cuò)! n);?W ACl n p( );? leep(SLEPMS);rtu n;?cha se DataSEN AX_
41、LE GTH;mem t( ndaa, , ND MAX LNGT);s ri tf( e da a,%s , 你好發(fā)送方,我是接受方 !);if( CK _EROR = ed(sokconn,sendDt,strl(sendData)+,0) ) prnt( 發(fā)送連接提示信息出錯(cuò) !n);?WSACleanu ( );? clo e ocket(sockc nn);? Sle( SLEEPM ) ; e rn;ch getDa a EC V AX_ EN H;memst(etData, 0, RCEIE_MAX NG );ecv(sccn, gtata,RE IVE M X TH , );p
42、rintf ( , t ata) ;?pri f(1bit 滑動(dòng)窗口協(xié)議:接收方 ,接收窗口 n);?Lin Queu Q eueQ;InitLine(&QueueQ) ;fram p ketreceie; /?f ame pack tsend; / a ,ak n urw GetFram Fro Ho ( Queue ); /初始化接收窗口?int ret = 0;?wh e(1)?meset(&packet ece ve, 0, i e( packetrec e);Slep(LEEMS)pri tf(n )?ret = recv(sockconn , (car )&p c t ceiv,
43、sizeof ( pa k tr cei e), );? f(ret = OCKT_RROR | ret = CKE _ SCONN)? ?f(re SOCKET RR)? ?rnf( 連接出錯(cuò)!自動(dòng)連接 !n);?c? nti ue;? ? else? ?pin(連接已斷開(kāi),按 q 退出,其他鍵等待新的連接 )? t k = getch() ;? i(kb = q | kbc = )? ? ? re k;? ?e se ? WSAC eanp();?close cket(sockconn) ;? ?Sle (SLEEPMS);? ? oto Be in;? ? ?s nd(unsined)t
44、 e(NU L);wit h(rnd() 5) /假定產(chǎn)生隨機(jī)結(jié)果, 2%的概率校驗(yàn)錯(cuò)誤或接收發(fā)送方超時(shí)? ?a e 0:?prin f( 接受數(shù)據(jù)幀 :ata %d, d,校驗(yàn)錯(cuò)誤 ,丟棄 (數(shù)據(jù)幀出錯(cuò)模擬) , pake eceive.head.seq, packetreceiv .size);? ?memse ( packet end, 0, zeo( packetse d);?m?emcpy(&pa kets nd, &p cketre ive, szef(packerecve);?acketsnd.headack = packtreceiv. e d.s q;? pa etsen .he d.s q curw;?packets n head.knd = na ;? pri tf( 發(fā)送否認(rèn)幀 :nak % n, p cke rec i e.h ad .s q);?break;? case :? pakesn .head.kind tout;? rintf( 發(fā)送方發(fā)送數(shù)據(jù)超時(shí) (數(shù)據(jù)幀丟失模擬 ): , packet ci e.head.se );?b?r ak;? ? e a lt:?p tf( 接受數(shù)據(jù)幀: d ta d, %d,校驗(yàn)正確 n, p
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版生產(chǎn)設(shè)備安裝與維護(hù)協(xié)議3篇
- 第十講 市場(chǎng)營(yíng)銷實(shí)務(wù)新發(fā)展
- 第11課《短文二篇》說(shuō)課稿 2024-2025學(xué)年統(tǒng)編版語(yǔ)文八年級(jí)上冊(cè)
- 小學(xué)生情緒課堂
- 二項(xiàng)分布課件
- 2024年綜合信息安全集成協(xié)議樣本版B版
- 信訪當(dāng)事人息訴承諾書(shū)
- 2024年金屬制品代售合同范本3篇
- 2024年07月湖南平安銀行長(zhǎng)沙分行招考(722)筆試歷年參考題庫(kù)附帶答案詳解
- 2024年07月湖北漢口銀行武漢經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)支行社會(huì)招考(716)筆試歷年參考題庫(kù)附帶答案詳解
- 后續(xù)服務(wù)承諾及保證措施-后續(xù)服務(wù)
- 提高無(wú)創(chuàng)呼吸機(jī)患者的依從性
- 小兒急性顱內(nèi)壓增高的護(hù)理課件
- 腫瘤科工作制度
- 幼兒園幼兒日常行為規(guī)范
- 供應(yīng)鏈質(zhì)量防線:供應(yīng)商質(zhì)量管理的策略、方法與實(shí)踐
- 有限空間作業(yè)安全管理監(jiān)理實(shí)施細(xì)則
- GB/T 4795-2023船用艙底水處理裝置
- 企業(yè)實(shí)際控制人的協(xié)議書(shū)
- 質(zhì)量管理體系ISO9001-2015標(biāo)準(zhǔn)
- 通信網(wǎng)絡(luò)英語(yǔ)課件
評(píng)論
0/150
提交評(píng)論