版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、課程設(shè)計報告 - 滑動窗口協(xié)議仿 真作者:日期:滁州學(xué)院課程設(shè)計報告課程名稱:計算機網(wǎng)絡(luò)設(shè)計題目 :滑動窗口協(xié)議仿真系別 :計算機與信息工程學(xué)院專業(yè) :計算機科學(xué)與技術(shù)組 別:第五組起止日期 : 201 年11 月 24 日01年 1月 7 日指導(dǎo)教師:趙國柱計算機與信息工程學(xué)院二一一年制課程設(shè)計題目滑動窗口協(xié)議仿真組長趙育坤學(xué)號2011220135班級計專 1 班系別計算機與信息 工程學(xué)院專業(yè)計算機科學(xué)與技術(shù)組員閆婷、張俠、余靜、于東鋒、張飛、趙育坤指導(dǎo)教師趙國柱課程設(shè)計目的掌握滑動窗口協(xié)議的基本原理,并能夠用所學(xué)計算機高級語言進行編程模擬課程設(shè)計所需環(huán)境開發(fā)環(huán)境 : VC+運行環(huán)境 : W
2、indows 操作系統(tǒng)課程設(shè)計任務(wù)要求1. 程序按照滑動窗口協(xié)議實現(xiàn)端對端的數(shù)據(jù)傳送。 包括協(xié)議的各種 策略 ,如包丟失、停等應(yīng)答、超時等都應(yīng)有所仿真實現(xiàn)2顯示數(shù)據(jù)傳送過程中的各項具體數(shù)據(jù)。雙方幀的個數(shù)變化,幀序號 ,發(fā)送和接受速度 ,暫停或重傳提示等課程設(shè)計工作進度計劃序號起止日期工 作 內(nèi) 容分工情況111 月 24 號11月 27號了解工作要求, 明確分工內(nèi) 容, 網(wǎng)上查閱相關(guān)資料所有組員共同參與211 月 8 號 1 月30 號s nder 隊列模塊的編寫由閆婷完成312 月 1 號12 月號en e主函數(shù)的編寫由趙育坤、張飛完成11 月 28 號月30 號recei er 隊列模塊的
3、編寫由張俠完成512月 1號12 月 4 號receiver 主函數(shù)的編寫由余靜、于東鋒完成62月 5號月 7 號最后匯總 , 調(diào)試由趙育坤、于東鋒完成指導(dǎo)教師簽字: 年 月 日教研室審核意見 :教研室主任簽字 :年月日課程設(shè)計任務(wù)書一 . 引言二. 基本原理2.1 窗口機制22 1 t 滑動窗口協(xié)議 .3 后退協(xié)議2. 選擇重傳協(xié)議2 5 流量控制三 需求分析 .1 課程設(shè)計題目3.2 開發(fā)環(huán)境3.3 運行環(huán)境3 課程設(shè)計任務(wù)及要求3.5 界面要求3.6 網(wǎng)絡(luò)接口要求四. 詳細設(shè)計4. 結(jié)構(gòu)體的定義4.2 發(fā)送方的主要函數(shù)4.3 接受方的主要函數(shù)五. 源代碼5.1 發(fā)送方的主要代碼5.2 接
4、收方的主要代碼 六 調(diào)試與操作說明致謝 參考文獻 課程設(shè)計的主要內(nèi)容. 引言早期的網(wǎng)絡(luò)通信中 , 通信雙方不會考慮網(wǎng)絡(luò)的擁擠情況直接發(fā)送數(shù)據(jù)。由于大家 不知道網(wǎng)絡(luò)擁塞狀況,一起發(fā)送數(shù)據(jù),導(dǎo)致中間結(jié)點阻塞掉包,誰也發(fā)不了數(shù)據(jù)。在 數(shù)據(jù)傳輸過程中,我們總是希望數(shù)據(jù)傳輸?shù)母煲恍?,但如果發(fā)送方把數(shù)據(jù)發(fā)送的過快 , 接收方就可能來不及接收 , 這就造成數(shù)據(jù)的丟失。 因此就有了滑動窗口機制來解決這些問 題。早期我們使用的是 1b t 滑動窗口協(xié)議,一次只發(fā)送一個幀,等收到 ack 確認才 發(fā)下一個幀 , 這樣對信道的利用率太低了。 因此提出了一種采用累積確認的連續(xù)ARQ協(xié)議 ,接收方不必對收到的幀逐個發(fā)
5、送 ack 確認, 而是收到幾個幀后,對按序到達的最后一個幀發(fā) 送 ck 確認。同 1bit 滑動窗口協(xié)議相比 , 大大減少了 a數(shù)量,并消除了延遲 a k 對傳 輸效率的影響。 但是 , 這會產(chǎn)生一個新的問題, 如果發(fā)送方發(fā)送了 5 個幀 , 而中間的第 3 個幀 丟失了。 這時接收方只能對前 2 個幀發(fā)出確認。 發(fā)送方無法知道后面三個幀的下落, 只好把 后面的個幀再重傳一次, 這就是回退 N協(xié)議。為了解決這個問題 , 又提出了選擇重傳協(xié)議。 當(dāng)接收方發(fā)現(xiàn)某幀出錯后,繼續(xù)接受后面送來的正確的幀,只是不交付它們,存放在 自己的緩沖區(qū)中 , 并且要求發(fā)送方重傳出錯的那一幀。 一旦收到重傳來的幀后
6、 , 就可以 將存于緩沖區(qū)中的其余幀一并按正確的順序遞交給主機。2. 基本原理2 窗口機制滑動窗口協(xié)議的基本原理就是在任意時刻,發(fā)送方都維持了一個連續(xù)的允許發(fā)送的 幀的序號,稱為發(fā)送窗口 ; 同時 , 接收方也維持了一個連續(xù)的允許接收的幀的序號 , 稱為 接收窗口。發(fā)送窗口和接收窗口的序號的上下界不一定要一樣,甚至大小也可以不同。 不同的滑動窗口協(xié)議窗口大小一般不同。發(fā)送方窗口內(nèi)的序號代表了那些已經(jīng)被發(fā)送, 但是還沒有被確認的幀,或者是那些可以被發(fā)送的幀。接受方為其窗口內(nèi)的每一個序號保 留了一個緩沖區(qū)。與每個緩沖區(qū)相關(guān)聯(lián)的還有一位 , 用來指明該緩沖區(qū)是滿的還是空的。 ? 若從滑動窗口的觀點來
7、統(tǒng)一看待比特滑動窗口、后退 n 及選擇重傳三種協(xié)議 , 它們的 差別僅在于各自窗口尺寸的大小不同而已。 1比特滑動窗口協(xié)議 : 發(fā)送窗口 =1,接收窗口 =1; 后退協(xié)議 : 發(fā)送窗口 1,接收窗口 =1;選擇重傳協(xié)議:發(fā)送窗口, 接收窗口 。2.2 1bit 滑動窗口協(xié)議當(dāng)發(fā)送窗口和接收窗口的大小固定為時,滑動窗口協(xié)議退化為停等協(xié)議( stop- nd a t) 。該協(xié)議規(guī)定發(fā)送方每發(fā)送一幀后就要停下來, 等待接收方已正確接收的確認 (ackno led ement )返回后才能繼續(xù)發(fā)送下一幀。由于接收方需要判斷接收到的 幀是新發(fā)的幀還是重新發(fā)送的幀 , 因此發(fā)送方要為每一個幀加一個序號。由
8、于停等協(xié)議規(guī)定只有一幀完全發(fā)送成功后才能發(fā)送新的幀 方和接收方運行的流程圖如圖所示。, 因而只用一比特來編號就夠了。其發(fā)送發(fā)送方接收方大大降低了信道利用23 后退 N 協(xié)議由于停等協(xié)議要為每一個幀進行確認后才繼續(xù)發(fā)送下一幀,率,因此又提出了后退協(xié)議。后退n 協(xié)議中,發(fā)送方在發(fā)完一個數(shù)據(jù)幀后, 不停下 來等待應(yīng)答幀 ,而是連續(xù)發(fā)送若干個數(shù)據(jù)幀 , 即使在連續(xù)發(fā)送過程中收到了接收方發(fā) 來的應(yīng)答幀 , 也可以繼續(xù)發(fā)送。且發(fā)送方在每發(fā)送完一個數(shù)據(jù)幀時都要設(shè)置超時定時 器。只要在所設(shè)置的超時時間內(nèi)仍收到確認幀,就要重發(fā)相應(yīng)的數(shù)據(jù)幀。如:當(dāng)發(fā)送 方發(fā)送了個幀后 , 若發(fā)現(xiàn)該 N 幀的前一個幀在計時器超時后
9、仍未返回其確認信息,N 幀。則該幀被判為出錯或丟失 , 此時發(fā)送方就不得不重新發(fā)送出錯幀及其后的 從這里不難看出,后退 n 協(xié)議一方面因連續(xù)發(fā)送數(shù)據(jù)幀而提高了效率 , 但另一方 面,在重傳時又必須把原來已正確傳送過的數(shù)據(jù)幀進行重傳(僅因這些數(shù)據(jù)幀之前有 一個數(shù)據(jù)幀出了錯) , 這種做法又使傳送效率降低。由此可見,若傳輸信道的傳輸質(zhì)2.4 選擇重傳協(xié)議的正確的幀雖然不能立即遞交給接收方的高層, 但接收方仍可收下來,存放在一個緩沖在后退 n 協(xié)議中,接收方若發(fā)現(xiàn)錯誤幀就不再接收后續(xù)的幀, 即使是正確到達的幀,, 其后繼續(xù)送來這顯然是一種浪費。另一種效率更高的策略是當(dāng)接收方發(fā)現(xiàn)某幀出錯后區(qū)中,同時要
10、求發(fā)送方重新傳送出錯的那一幀。一旦收到重新傳來的幀后 , 就可以原已S LE T, 但要求接收方有存于緩沖區(qū)中的其余幀一并按正確的順序遞交高層。這種方法稱為選擇重發(fā)( CE E E T), 其工作過程如圖所示。顯然,選擇重發(fā)減少了浪費 足夠大的緩沖區(qū)空間。2. 流量控制TCP 的特點之一是提供體積可變的滑動窗口機制,支持端到端的流量控制。 TCP 的窗口以字節(jié)為單位進行調(diào)整 , 以適應(yīng)接收方的處理能力。處理過程如下 :(1)TCP連接階段,雙方協(xié)商窗口尺寸,同時接收方預(yù)留數(shù)據(jù)緩存區(qū);( 2)發(fā)送方根據(jù)協(xié)商的結(jié)果,發(fā)送符合窗口尺寸的數(shù)據(jù)字節(jié)流,并等待對方的確認;(3)發(fā)送方根據(jù)確認信息,改變窗口
11、的尺寸, 增加或者減少發(fā)送未得到確認的字節(jié)流中的字節(jié)數(shù)。調(diào)整過程包括 : 如果出現(xiàn)發(fā)送擁塞 ,發(fā)送窗口縮小為原來的一半, 同時將超時重傳的時間間隔擴大一倍。( 4)滑動窗口機制為端到端設(shè)備間的數(shù)據(jù)傳輸提供了可靠的流量控制機制。然而, 它只能在源端設(shè)備和目的端設(shè)備起作用,當(dāng)網(wǎng)絡(luò)中間設(shè)備 (例如路由器等 ) 發(fā)生擁塞 時,滑動窗口機制將不起作用。3. 需求分析3. 課程設(shè)計題目:滑動窗口協(xié)議仿真. 開發(fā)環(huán)境 : isual C+ 6.03.3 運行環(huán)境: W dows 操作系統(tǒng).4 課程設(shè)計任務(wù)及要求 :(1) 程序按照滑動窗口協(xié)議實現(xiàn)端對端的數(shù)據(jù)傳送。包括協(xié)議的各種策略,如包丟失、停 等應(yīng)答、超
12、時等都應(yīng)有所仿真實現(xiàn)。 ? ( 2)顯示數(shù)據(jù)傳送過程中的各項具體數(shù)據(jù)。雙方幀 的個數(shù)變化 , 幀序號,發(fā)送和接受速度,暫停或重傳提示等。3.5 界面要求:此次課程設(shè)計要求的所有功能應(yīng)可視 , 我們組主要是用 V +編寫的, 運行在 DOS環(huán)境 下, 觀察發(fā)送方 (sender) 發(fā)送數(shù)據(jù)包到接收方 (rec ive) 時。界面應(yīng)顯示出雙方幀個數(shù)的變 化, 幀序號,發(fā)送和接受速度 ,暫?;蛑貍魈崾镜?, 界面中必須動態(tài)顯示數(shù)據(jù)幀的發(fā)送和接受 情況 ,包括在相應(yīng)的窗口詳細顯示相應(yīng)的 CK和其他收發(fā)數(shù)據(jù)幀后發(fā)出的消息, 以表明模擬協(xié)議的正確運作過程。 在各種情況下, 接受方和發(fā)送方窗口應(yīng)實時顯示幀的
13、發(fā)送和接受情況, 包括序號 , 時間戳,內(nèi)容等。以及窗口的填充和清空情況。3.6 網(wǎng)絡(luò)接口要求 :接收數(shù)據(jù)的端口初始應(yīng)為監(jiān)/幀類型兩臺機器或是一臺機器中兩個獨立的線程模擬發(fā)送方與接受方, 聽狀態(tài)。發(fā)送方向接受方發(fā)起連接,成功后開始發(fā)送數(shù)據(jù)。4. 概要設(shè)計.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 ; /序列號u sig ed i t ack; /確認號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 /隊列節(jié)點類型 a head_da a;str ct m nod * ext; rme de; pede struc ra enode * t; /隊頭指針 rameode *rear ;/隊尾指針 LinkQue ;4.2 發(fā)送方的主要函數(shù)實現(xiàn) : 函數(shù)名: vod I t ine(LinkQueue *q ) ; ? 功 能:初始化隊列。函數(shù)名 :v id tFrameFrom ost(Lin Qeue *);功 能:從主機取數(shù)據(jù)幀 ,
15、由于實驗需要,假設(shè)主機有足夠多的數(shù)據(jù)幀要發(fā)送。 voi eL n( inkQueue *q); ?功 能:數(shù)據(jù)幀發(fā)送完畢 (收到確認幀)后,刪除發(fā)送的數(shù)據(jù)幀(隊頭 )。函數(shù)名 :int QueueEmpty( kQueue ); ?功 能:判斷隊列是否為空。函數(shù)名 :f ame Q eueF on( LnkQeue ) ;功 能 :取隊頭,首幀是準(zhǔn)備好待發(fā)送的幀。函數(shù)名 :in QueueLe(Li kQueue *q);功 能:計算隊列長度。函數(shù)名 :DW RD NAPI Rec ive n(LP O D pAr ); 功 能:發(fā)送線程調(diào)用的函數(shù) ,pArg 參數(shù)存接收幀指針。 函數(shù)名: v
16、oid main() ;功 能:發(fā)送方主函數(shù),首先和接收方(本機 12.0.1)建立 ket 連接并初始化發(fā)送 隊列。然后重復(fù)下面的步驟 :(1)從主機取數(shù)據(jù)幀;(2)發(fā)送數(shù)據(jù)幀,含超時重發(fā)(接收方未收到或未收到接收方ack)和錯誤重發(fā) (收到接收方 n);()設(shè)置超時計時器,這里是 5 秒;( 4)等待確認,調(diào)用 Cre teThread() 函數(shù)創(chuàng)建一個線程 ,超時則調(diào)用 Ter inateT r ad() 函數(shù)結(jié)束線程并再次發(fā)送數(shù)據(jù)幀。收到數(shù)據(jù)幀則做后續(xù)處理;(5)收到否認幀 na則再次發(fā)送數(shù)據(jù)幀 ,收到確認幀 a k 則發(fā)送下一個數(shù)據(jù)幀 ; (6)如果發(fā)送的測試時間達到 0 秒,則提示
17、是否繼續(xù)測試 ,按 q或退出測試。4.3 接收方的主要函數(shù)實現(xiàn): 函數(shù)名: od IiLi ( L k uee *q); 功 能 :初始化隊列。函數(shù)名 :void et a eFromHost( LinkQu ue *q);功 能:準(zhǔn)備好接收幀的緩沖池,首幀是待接收的幀 , 尾幀是已經(jīng)接收的待提交主機的幀。 由于實驗需要 ,假設(shè)數(shù)據(jù)幀送往主機是足夠快的。int Line(Li Queue q, ram p, un ed nt cuw) 功 能:將幀數(shù)據(jù)保存供提交主機, c rw 是打開的待接收數(shù)據(jù)的窗口。函數(shù)名: t QueueEmpty(Lin Queue *q ) ;功 能:判斷隊列是否為
18、空。函數(shù)名 : t QeueLe(inkQue e q); 功 能:計算隊列長度。函數(shù)名: oid a n();功 能 :接收方主函數(shù),首先和發(fā)送方建立soc t 連接并初始化初始化接收窗口。然后重復(fù)下面的步驟 :(1)等待 ,接收數(shù)據(jù)幀;()校驗數(shù)據(jù)幀,假定產(chǎn)生隨機結(jié)果,%的概率校驗錯誤或發(fā)送方發(fā)送數(shù)據(jù)幀超時;(3) 校驗錯誤時 ,丟棄數(shù)據(jù)幀 ,并發(fā)送否認幀 nak;(4) 如果出現(xiàn)接收超時(假定未收到發(fā)送方發(fā)送的數(shù)據(jù)幀),則不給發(fā)送發(fā)任何回應(yīng);(5) 如果校驗正確,首先判斷是否是上一幀的重發(fā)。是上一幀的重發(fā),則丟棄數(shù)據(jù)幀,并發(fā) 送確認幀 ac;是新的數(shù)據(jù)幀,則保存數(shù)據(jù)幀到當(dāng)前接收窗口,并發(fā)
19、送確認幀ck。(6) 送數(shù)據(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( 隊列為空! 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; / 幀大小隨機生成?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 (從主機得到 :da d,放入緩存 , p he d_data hea . eq); Frmeromos() ; / 由于實驗需要 ,假設(shè)主機有足夠多的數(shù)據(jù)幀要發(fā)送oi DeLi e( inkQueue *q)?Framenode * N LL; f( ueEpty(q) )?prin f( 隊列為空! 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庫? Ver onReqested EWORD(1,1 ); /兩個 yte型合并成一個 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 ( )成對使用Sleep(SLEEP S); et r ;?sckeClent = s ket(F_IT,OCK_STREM,0);/監(jiān)聽的套接字?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( 接受連接提示信息出錯! );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ā)送連接提示信息出錯 !n);?WS Cl nup() ;? closes ck t( socke Clie t);Sleep(SLE MS);re rn;printf( 按任意鍵繼續(xù)! n);?hile (! it() ; /等待開始?Slep(SLEE S);?pinf(1b t 滑動窗口協(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);?/從主機取數(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ù)出錯 !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è)置超時計時器5 秒超時?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); 成對使用i(et = CKE _E ROR | rt = SOC ET_DI CON )?prin f( 接受出錯 !Press any key o conti n) ;?while (!kbhi () ;? ?continue ;?f(r WAWIT_TMEOUT) / 判斷超時?TrmiaeT ead(
30、 Th ea, 0); / 終止線程? ? intf ( 超時重傳 :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)生隨機結(jié)果 ,20%的概率超時?cas 0 :?printf( 接收方發(fā)送回復(fù)超時( ak 丟失模擬) :% , acketsend. ea seq);? ?prin (超時重傳 :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 ( 幀序號出錯:%dn, pac etreceiv . ead.ack);i(GtTickC un() t 2 * TIME UT) /設(shè)置時間 2秒? pri
32、ntf( 持續(xù)時間 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 );進入 cri cal sectionfrm *packetrec e = (frame *)pArg
33、 ;?e r cv( ocketC ient, (car *)pack r eive, si f(*p ket eceiv ), );?LevCiticalSecin(&CS); /線程用畢,離開 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 (隊列為空! );? 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ù)幀 送往主機是足夠快的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)提交主機p ntf( 向主機交付 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ā)送幀序號?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庫wVrioneqesd = MAK WORD( 1 , 1 ); 兩個 e型合并成一個 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()成對使用?Seep(S EPM
39、S) ;rtr;OKET socksr = socket(AF_NE,SOCK_STEAM,0) ;/監(jiān)聽的套接字SC ADDR I s cke add; ock t d in_adr S un S adr ht nl( NA DR_ANY); / 監(jiān)聽連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(綁定出錯! n );?WSA le nup();Slep(SLEM);
40、e rn;if( SOCKET ROR =isten(ocksr ,5) )prntf( 監(jiān)聽出錯 !);?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(建立連接出錯! 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ā)送連接提示信息出錯 !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 滑動窗口協(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( 連接出錯!自動連接 !n);?c? nti ue;? ? else? ?pin(連接已斷開,按 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)生隨機結(jié)果, 2%的概率校驗錯誤或接收發(fā)送方超時? ?a e 0:?prin f( 接受數(shù)據(jù)幀 :ata %d, d,校驗錯誤 ,丟棄 (數(shù)據(jù)幀出錯模擬) , 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ā)送否認幀 :nak % n, p cke rec i e.h ad .s q);?break;? case :? pakesn .head.kind tout;? rintf( 發(fā)送方發(fā)送數(shù)據(jù)超時 (數(shù)據(jù)幀丟失模擬 ): , packet ci e.head.se );?b?r ak;? ? e a lt:?p tf( 接受數(shù)據(jù)幀: d ta d, %d,校驗正確 n, p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人住宅買賣合同(含物業(yè)交割)2篇
- 2025年度智慧停車場運營管理承包合同4篇
- 2025年度水暖工程安全質(zhì)量監(jiān)督及驗收合同
- 二零二五年度房產(chǎn)抵押貸款風(fēng)險管理與服務(wù)合同4篇
- 2025年度暖氣片銷售區(qū)域代理合同模板
- 2025年度面包磚產(chǎn)品研發(fā)與市場推廣合作合同3篇
- 二零二五版農(nóng)機作業(yè)租賃與農(nóng)業(yè)觀光旅游合作合同4篇
- 二零二五年度面包烘焙原料質(zhì)量控制合同4篇
- 2025年度綠色能源交易合作運營協(xié)議合同范本3篇
- 2025年度木地板原材采購與加工合同范本4篇
- 妊娠合并低鉀血癥護理查房
- 煤礦反三違培訓(xùn)課件
- 向流程設(shè)計要效率
- 安全文明施工的管理要點
- 2024年中國航空發(fā)動機集團招聘筆試參考題庫含答案解析
- 當(dāng)代中外公司治理典型案例剖析(中科院研究生課件)
- 動力管道設(shè)計手冊-第2版
- 2022年重慶市中考物理試卷A卷(附答案)
- Python繪圖庫Turtle詳解(含豐富示例)
- 煤礦機電設(shè)備檢修技術(shù)規(guī)范完整版
- 榆林200MWp并網(wǎng)光伏發(fā)電項目可行性研究報告
評論
0/150
提交評論