6、edchar*frame,intlen)//crc编码并向物理层发送{*(unsignedint*)(frame+len)=crc32(frame,len);send_frame(frame,len+4);phy_ready=0;}staticvoidsend_data(unsignedcharkind,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[],intdlen[])//生成帧{frames;s.kind=kind;if(kind==Ack)//生成ack帧{s.ack=(frame_exp
7、ected+MAX_SEQ)%(MAX_SEQ+1);dbg_frame("SendACK%d",s.ack);put_frame((unsignedchar*)&s,2);}elseif(kind==Nak)//生成nak帧,s.ack记录需要重传的窗口号{s.ack=frame_expected;dbg_frame("SendNAK%d",s.ack);put_frame((unsignedchar*)&s,2);}else//生成数据(data)帧{memcpy(s.info,buffer[frame_nr],PKT_LEN);s.s
8、eq=frame_nr;s.ack=(frame_expected+MAX_SEQ)%(MAX_SEQ+1);dbg_frame("SendDATA%d%d,ID%d",s.seq,s.ack,*(short*)s.info);put_frame((unsignedchar*)&s,3+dlen[frame_nr]);start_timer(frame_nr,DATA_TIMER);}phy_ready=0;stop_ack_timer();}计算机网络滑动窗口实验程序清单Page4/4intmain(intargc,char**argv){i
9、ntevent,arg,len;intbufferLen[MAX_SEQ+1];seq_nrnext_frame_to_send=0;/*MAX_SEQ>1;usedforoutboundstream,andinitianizenextframegoingout*/seq_nrack_expected=0;/*oldestframeasyetunacknowledged,andinitianizenextackexpectedinbound*/seq_nrframe_expected=0;/*nextframeexpectedoninboundst
10、ream,andinitializenumberofframeexpectedinbound*/framer;/*scratchvarible*/packetbuffer[MAX_SEQ+1];/*buffersfortheoutboundstream*/seq_nrnbuffered=0;/*#outputbufferscurrentlyinuse,andinitiallynopacketsarebuffered*/seq_nri;/*usedtoindexintothebufferarray*/protocol_init(argc,argv);
11、lprintf("DesignedbyLiuYang,TengXiao,XuYeNan,build:"__DATE__""__TIME__"");enable_network_layer();while(true){event=wait_for_event(&arg);switch(event){caseNETWORK_LAYER_READY:/*thenetworklayerhasapackettosend*/bufferLen[next_frame_to_send]=get_packet(buffer[next_frame_to_sen
12、d]);/*bufferLen存储每个buffer中数据的有效长度*/nbuffered++;/*expandthesen