-
大小: 21KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-06-19
- 語言: 其他
- 標(biāo)簽: 網(wǎng)絡(luò)實驗??NetRiver2000??清華大學(xué)??
資源簡介
上傳的文件中包含《計算機網(wǎng)絡(luò)實驗系統(tǒng) NetRiver2000》中的前九個實驗,代碼思路清晰,注釋詳盡

代碼片段和文件信息
#include?“sysinclude.h“
#include?
#include?
#include?
#include?
#include?
using?namespace?std;
extern?void?SendframePacket(unsigned?char*?pData?unsigned?int?len);
#define?WINDOW_SIZE_STOP_WAIT???????????1
#define?WINDOW_SIZE_BACK_N_frame????????4
#define?MAX_DATA_SIZE???????????????????100
typedef?enum?{data?ack?nak}?frame_kind;
typedef?struct
{
????frame_kind??kind;???????????????????//?kind?of?frame
????unsigned?int?seq;???????????????????//?seq?no?of?frame
????unsigned?int?ack;???????????????????//?ack?no?of?frame
????unsigned?char?data[MAX_DATA_SIZE];??//?data
}frame_head;
typedef?struct
{
????frame_head?head;????????????????????//?frame?head
????unsigned?int?size;??????????????????//?frame?sizei?actual?size?of?data
}frame;
/*
?*?停等協(xié)議測試函數(shù)
?*?參數(shù)說明:
?***?pBuffer????指針,系統(tǒng)要發(fā)送或者已經(jīng)接收到的幀內(nèi)容,或者指向超時信息中
????????????????的超時幀序號
?***?bufferSize?????pBuffer表示內(nèi)容的長度
?***?messageType????傳入消息的類型,可選項由宏定義
?*?返回值:
?***?0??發(fā)送成功
?***?-1?發(fā)送失敗
?*/
int?stud_slide_window_stop_and_wait(char?*pBuffer?
????????????????????????????????????int?bufferSize?
????????????????????????????????????UINT8?messageType)
{
????/*
?????*?為方便后續(xù)兩個函數(shù)的編程,我們定義兩個隊列:
?????***?waitQueue
?????******?暫時無法發(fā)送的數(shù)據(jù)包(沒有可用窗口),緩存在該隊列中;
?????***?confirmQueue
?????******?已經(jīng)發(fā)送但是尚未確認的數(shù)據(jù)包,緩存在該隊列中;
?????*?注:對于停止等待協(xié)議而言,confirmQueue其實不需要,我們可以使用一個結(jié)構(gòu)體記錄
?????*?尚未確認的數(shù)據(jù)包即可,因為該協(xié)議中,尚未確認的數(shù)據(jù)包數(shù)目永遠不會大于1。
?????*/
????static?queueame>?waitQueue;
????static?vectorame>?confirmQueue;
????static?unsigned?int?expectedNo?=?0;???//?記錄當(dāng)前期望收到的數(shù)據(jù)包?seq?no
????/*
?????*?當(dāng)上層傳來一個新數(shù)據(jù)包?i?時,我們需要進行如下判斷:
?????*?Case1...messageType?==?MSG_TYPE_SEND
?????***?Subcase1...waitQueue?不為空
?????******?我們采用?FIFO?方案,此時僅僅需要將?i?掛載到?waitQueue?隊列尾部,
????????????并且為之標(biāo)記序號;
?????**?Subcase2...waitQueue?為空
?????******?我們需要進一步判斷:
????????????Subsubcase1...confirmQueue?為空
????????????????我們直接發(fā)送當(dāng)前數(shù)據(jù)包
????????????Subsubcase2...comfirmQueue?不為空
????????????????將數(shù)據(jù)包?i?掛載到?waitQueue?隊列,并為之標(biāo)記序號
?????***?Case2...messageType?==?MSG_TYPE_RECEIVE?&&?ACK
?????******?此時檢查?ACK(i)?所響應(yīng)的數(shù)據(jù)包?(i-1)?是否存在于?confirmQueue:
????????????如果存在則直接刪除,并且檢查?waitQueue?中是否存在需要發(fā)送的數(shù)據(jù)包;
????????????如果不存在,直接丟棄當(dāng)前ACK數(shù)據(jù)包
?????***?Case3...messageType?==?MSG_TYPE_TIMEOUT
?????******?如果?confirmQueue?中存在數(shù)據(jù)包,則重新發(fā)送這個數(shù)據(jù)包;
????????????如果不存在,說明程序出現(xiàn)bug;
?????*/
????switch(?messageType?)
????{
????????case?MSG_TYPE_TIMEOUT:
????????{
????????????if?(?confirmQueue.size()?==?0?)
????????????????return?-1;
????????????assert(confirmQueue.size()?==?1);
????????????SendframePacket((unsigned?char?*)&confirmQueue.front()
????????????????????????????confirmQueue.front().size);
????????????return?0;
????????}
????????case?MSG_TYPE_SEND:
????????{
????????????frame?sendframe;
????????????memcpy(?(void?*)&sendframe.head
????????????????????(void?*)pBuffer
????????????????????bufferSize?);
????????????sendframe.size?=?bufferSize;
????????????if?(?waitQueue.empty
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????10322??2012-09-06?14:44??labs\lab01.cpp
?????文件???????6621??2012-09-06?14:44??labs\lab02.cpp
?????文件???????6510??2012-09-06?14:44??labs\lab03.cpp
?????文件???????5204??2012-09-06?14:44??labs\lab04.cpp
?????文件???????7137??2012-09-06?14:41??labs\lab05.cpp
?????文件??????13459??2012-09-06?14:44??labs\lab06.cpp
?????文件??????18633??2012-09-06?14:43??labs\lab07.cpp
?????文件??????10256??2012-09-06?14:44??labs\lab08.cpp
?????文件???????6606??2012-06-12?14:35??labs\lab09.cpp
?????目錄??????????0??2012-09-07?18:42??labs
-----------?---------??----------?-----??----
????????????????84748????????????????????10
評論
共有 條評論