資源簡(jiǎn)介
北郵 計(jì)算機(jī)網(wǎng)絡(luò)課程實(shí)驗(yàn) 滑動(dòng)窗口協(xié)議 選擇重傳協(xié)議與go-back-n協(xié)議
壓縮包內(nèi)附實(shí)驗(yàn)報(bào)告與配套代碼

代碼片段和文件信息
#include?
#include?
#include?“protocol.h“
#define?MAX_SEQ?15??????????????????//最大的窗口大小
#define?NR_BUFS?((MAX_SEQ?+?1)?/?2)?????//緩沖區(qū)大小
#define?DATA_TIMER??3000???????//幀超時(shí)時(shí)間間隔
#define?ACK_TIMER?240??????????//ack的超時(shí)間隔
struct?frame?{?
//數(shù)據(jù)幀的結(jié)構(gòu)體定義
????unsigned?char?kind;
????unsigned?char?ack;
????unsigned?char?seq;
????unsigned?char?data[PKT_LEN];?
????unsigned?int??padding;
};
int?no_nak=1; //標(biāo)志是否已經(jīng)發(fā)送過(guò)nak
static?int?phl_ready?=?0; //物理層就緒標(biāo)記
unsigned?char?oldest_frame?=?MAX_SEQ?+?1; //
static?int?between(unsigned?char?aunsigned?char?bunsigned?char?c)??
//滑動(dòng)窗口判斷函數(shù),判斷幀號(hào)(ack號(hào))是否在窗口內(nèi)
{
???if(((a?<=?b)?&&?(b? return?1;
else
return?0;
}
static?void?put_frame(unsigned?char?*frame?int?len)
{
//發(fā)送幀前預(yù)處理,加入校驗(yàn)和crc
????*(unsigned?int?*)(frame?+?len)?=?crc32(frame?len);//crc32校驗(yàn)
????send_frame(frame?len?+?4);//發(fā)送幀
????phl_ready?=?0;//設(shè)置物理層阻塞
}
static?void?send_data_frame(unsigned?char?fkunsigned?char?frame_nrunsigned?char?frame_expectedunsigned?char?buffer[NR_BUFS][PKT_LEN])
{
//發(fā)送數(shù)據(jù)幀,或ack與nak
????struct?frame?s;
????
????s.kind?=?fk;
????s.seq?=?frame_nr;
????s.ack?=?(frame_expected?+?MAX_SEQ)?%?(MAX_SEQ?+?1);
if(fk==frame_DATA)//發(fā)送的是數(shù)據(jù)幀
{
memcpy(s.data?buffer[frame_nr?%?NR_BUFS]?PKT_LEN);//復(fù)制分組到幀內(nèi)
dbg_frame(“Send?DATA?%d?%d?ID?%d\n“?s.seq?s.ack?*(short?*)s.data);//輸出記錄
????????put_frame((unsigned?char?*)&s?3?+?PKT_LEN);???//發(fā)送
start_timer(frame_nr?%?NR_BUFS?DATA_TIMER);?????//啟動(dòng)定時(shí)器
}
else?if(fk?==?frame_NAK)//發(fā)送的是NAK
{
no_nak?=?0;?????????????????????????????????????//下一次不再發(fā)送nak
????put_frame((unsigned?char?*)&s?3);????????????//發(fā)送
}
else?if(fk?==?frame_ACK)//發(fā)送的是ACK
{
dbg_frame(“Send?ACK??%d\n“?s.ack);//輸出記錄
????????put_frame((unsigned?char?*)&s?3);//發(fā)送
}
phl_ready?=?0; //物理層阻塞
stop_ack_timer();???????????????????????//關(guān)閉ack定時(shí)器
}
void?main(int?argc?char?**argv)
{
int?event?arg;
????struct?frame?f;
????int?len?=?0;
????int?i;
static?unsigned?char?ack_expected?=?0?next_frame_to_send?=?0;//當(dāng)前幀和下一期望幀的序號(hào)
static?unsigned?char?frame_expected?=?0?too_far?=?NR_BUFS;
????static?unsigned?char?nbuffered;
int?arrived[NR_BUFS];//緩沖區(qū),存放到達(dá)的幀
static?unsigned?char?out_buf[NR_BUFS][PKT_LEN]?in_buf[NR_BUFS][PKT_LEN];
????protocol_init(argc?argv);//初始化協(xié)議
????lprintf(“Coded?by?zdf?Build?Time:?“?__DATE__“??“__TIME__“\n“);
for(i?=?0;?i? arrived[i]?=?0;
????enable_network_layer();//啟動(dòng)網(wǎng)絡(luò)層,準(zhǔn)備接收數(shù)據(jù)
while(1)
{
event?=?wait_for_event(&arg); //等待事件,進(jìn)行下一步操作
switch?(event)
{
case?NETWORK_layer_READY:
nbuffered++;????????????????????//發(fā)送卻未被確認(rèn)的幀計(jì)數(shù)器+1
get_packet(out_buf[next_frame_to_send?%?NR_BUFS]);//得到分組存入緩沖區(qū)內(nèi)
send_data_frame(frame_DATAnext_frame_to_sendframe_expectedout_buf);//發(fā)送數(shù)據(jù)幀
next_frame_to_send=(next_frame_to_send?+?1)?%?(?MAX_SEQ?+?1);//處理滑動(dòng)窗口
break;
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件??????35647??2015-05-24?14:16??Selective\datali
?????文件??????46710??2015-05-24?14:16??Selective\datali
?????文件???????6152??2015-05-24?13:51??Selective\datali
?????文件???????3476??2009-10-19?16:46??Selective\datali
?????文件????????524??2009-10-16?10:23??Selective\datali
?????文件?????500736??2015-05-24?13:52??Selective\datali
?????文件????????518??2009-10-16?12:34??Selective\datali
?????文件????1095776??2015-05-24?13:52??Selective\datali
?????文件??????50176??2009-11-28?19:29??Selective\datali
?????文件???????4493??2015-05-19?13:31??Selective\datali
?????文件??????48640??2009-11-28?19:29??Selective\datali
?????文件????2617344??2015-05-24?13:52??Selective\datali
?????文件????????250??2009-11-28?19:00??Selective\datali
?????文件????2031616??2015-05-24?14:16??Selective\datali
?????文件????????961??2015-05-19?15:20??Selective\datali
????..A..H.?????19456??2015-05-24?14:16??Selective\datali
?????文件???????6293??2015-05-19?13:32??Selective\datali
?????文件???????1445??2015-05-24?13:52??Selective\Debug\datali
?????文件??????13592??2015-05-24?13:52??Selective\Debug\datali
?????文件????????616??2015-05-24?13:52??Selective\Debug\datali
?????文件????????980??2015-05-24?13:52??Selective\Debug\datali
?????文件????????384??2015-05-24?13:52??Selective\Debug\datali
?????文件????????164??2015-05-24?13:52??Selective\Debug\datali
?????文件???????1084??2015-05-24?13:52??Selective\Debug\datali
?????文件???????2694??2015-05-24?13:52??Selective\Debug\datali
?????文件????????464??2015-05-24?13:52??Selective\Debug\datali
?????文件??????27648??2015-05-24?13:52??Selective\Debug\vc120.idb
?????文件??????77824??2015-05-24?13:52??Selective\Debug\vc120.pdb
?????文件??????41984??2009-11-28?19:01??Selective\Debug\vc60.idb
?????文件??????53248??2009-11-28?19:00??Selective\Debug\vc60.pdb
............此處省略22個(gè)文件信息
評(píng)論
共有 條評(píng)論