课程设计报告滑动窗口协议仿真模板_第1页
课程设计报告滑动窗口协议仿真模板_第2页
课程设计报告滑动窗口协议仿真模板_第3页
课程设计报告滑动窗口协议仿真模板_第4页
课程设计报告滑动窗口协议仿真模板_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

滁州学院课程设计汇报课程名称:计算机网络设计题目:滑动窗口协议仿真系别:计算机与信息工程学院专业:计算机科学与技术组别:第五组起止日期:11月24日~12月7日指导老师:赵国柱计算机与信息工程学院二○一一年制课程设计题目滑动窗口协议仿真组长赵育坤学号班级计专1班系别计算机与信息工程学院专业计算机科学与技术组员闫婷、张侠、余静、于东锋、张飞、赵育坤指导老师赵国柱课程设计目掌握滑动窗口协议基础原理,并能够用所学计算机高级语言进行编程模拟课程设计所需环境开发环境:

VC++运行环境:Windows操作系统课程设计任务要求1.程序根据滑动窗口协议实现端对端数据传送。包含协议多种策略,如包丢失、停等应答、超时等都应有所仿真实现2.显示数据传送过程中各项具体数据。双方帧个数改变,帧序号,发送和接收速度,暂停或重传提醒等课程设计工作进度计划序号起止日期工作内容分工情况111月24号~11月27号了解工作要求,明确分工内容,网上查阅相关资料全部组员共同参与211月28号~11月30号sender队列模块编写由闫婷完成312月1号~12月4号sender主函数编写由赵育坤、张飞完成411月28号~11月30号receiver队列模块编写由张侠完成512月1号~12月4号receiver主函数编写由余静、于东锋完成612月5号~12月7号最终汇总,调试由赵育坤、于东锋完成指导老师签字:年月日教研室审核意见:教研室主任签字:年月日课程设计任务书一.引言二.基础原理2.1窗口机制2.21bit滑动窗口协议2.3后退N协议2.4选择重传协议2.5流量控制三.需求分析3.1课程设计题目3.2开发环境3.3运行环境3.4课程设计任务及要求3.5界面要求3.6网络接口要求四.具体设计

4.1结构体定义4.2发送方关键函数4.3接收方关键函数五.源代码5.1发送方关键代码5.2接收方关键代码六.调试与操作说明致谢[参考文件]课程设计关键内容1.引言早期网络通信中,通信双方不会考虑网络拥挤情况直接发送数据。因为大家不知道网络拥塞情况,一起发送数据,造成中间结点阻塞掉包,谁也发不了数据。在数据传输过程中,我们总是期望数据传输愈加快部分,但假如发送方把数据发送过快,接收方就可能来不及接收,这就造成数据丢失。所以就有了滑动窗口机制来处理这些问题。早期我们使用是1bit滑动窗口协议,一次只发送一个帧,等收到ack确定才发下一个帧,这么对信道利用率太低了。所以提出了一个采取累积确定连续ARQ协议,接收方无须对收到帧逐一发送ack确定,而是收到多个帧后,对按序抵达最终一个帧发送ack确定。同1bit滑动窗口协议相比,大大降低了ack数量,并消除了延迟ack对传输效率影响。不过,这会产生一个新问题,假如发送方发送了5个帧,而中间第3个帧丢失了。这时接收方只能对前2个帧发出确定。发送方无法知道后面三个帧下落,只好把后面3个帧再重传一次,这就是回退N协议。为了处理这个问题,又提出了选择重传协议。当接收方发觉某帧犯错后,继续接收后面送来正确帧,只是不交付它们,存放在自己缓冲区中,而且要求发送方重传犯错那一帧。一旦收到重传来帧后,就能够将存于缓冲区中其它帧一并按正确次序递交给主机。2.基础原理2.1窗口机制滑动窗口协议基础原理就是在任意时刻,发送方都维持了一个连续许可发送帧序号,称为发送窗口;同时,接收方也维持了一个连续许可接收帧序号,称为接收窗口。发送窗口和接收窗口序号上下界不一定要一样,甚至大小也能够不一样。不一样滑动窗口协议窗口大小通常不一样。发送方窗口内序号代表了那些已经被发送,不过还没有被确定帧,或者是那些能够被发送帧。接收方为其窗口内每一个序号保留了一个缓冲区。与每个缓冲区相关联还有一位,用来指明该缓冲区是满还是空。

若从滑动窗口见解来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们差异仅在于各自窗口尺寸大小不一样而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退N协议:发送窗口>1,接收窗口=1;选择重传协议:发送窗口>1,接收窗口>1。2.21bit滑动窗口协议当发送窗口和接收窗口大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。该协议要求发送方每发送一帧后就要停下来,等候接收方已正确接收确定(acknowledgement)返回后才能继续发送下一帧。因为接收方需要判定接收到帧是新发帧还是重新发送帧,所以发送方要为每一个帧加一个序号。因为停等协议要求只有一帧完全发送成功后才能发送新帧,所以只用一比特来编号就够了。其发送方和接收方运行步骤图如图所表示。2.3后退N协议因为停等协议要为每一个帧进行确定后才继续发送下一帧,大大降低了信道利用率,所以又提出了后退n协议。后退n协议中,发送方在发完一个数据帧后,不停下来等候应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来应答帧,也能够继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置超时时间内仍收到确定帧,就要重发对应数据帧。如:当发送方发送了N个帧后,若发觉该N帧前一个帧在计时器超时后仍未返回其确定信息,则该帧被判为犯错或丢失,此时发送方就不得不重新发送犯错帧及其后N帧。从这里不难看出,后退n协议首先因连续发送数据帧而提升了效率,但其次,在重传时又必需把原来已正确传送过数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。由此可见,若传输信道传输质量很差所以误码率较大时,连续测协议不一定优于停止等候协议。此协议中发送窗口大小为k,接收窗口仍是1。2.4选择重传协议在后退n协议中,接收方若发觉错误帧就不再接收后续帧,即使是正确抵达帧,这显然是一个浪费。另一个效率更高策略是当接收方发觉某帧犯错后,其后继续送来正确帧即使不能立刻递交给接收方高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送犯错那一帧。一旦收到重新传来帧后,就能够原已存于缓冲区中其它帧一并按正确次序递交高层。这种方法称为选择重发(SELECTICEREPEAT),其工作过程如图所表示。显然,选择重发降低了浪费,但要求接收方有足够大缓冲区空间。2.5流量控制TCP特点之一是提供体积可变滑动窗口机制,支持端到端流量控制。TCP窗口以字节为单位进行调整,以适应接收方处理能力。处理过程以下:(1)TCP连接阶段,双方协商窗口尺寸,同时接收方预留数据缓存区;(2)发送方依据协商结果,发送符合窗口尺寸数据字节流,并等候对方确定;(3)发送方依据确定信息,改变窗口尺寸,增加或者降低发送未得到确定字节流中字节数。调整过程包含:假如出现发送拥塞,发送窗口缩小为原来二分之一,同时将超时重传时间间隔扩大一倍。(4)滑动窗口机制为端到端设备间数据传输提供了可靠流量控制机制。然而,它只能在源端设备和目端设备起作用,当网络中间设备(比如路由器等)发生拥塞时,滑动窗口机制将不起作用。3.需求分析3.1课程设计题目:滑动窗口协议仿真3.2开发环境:VisualC++6.03.3运行环境:Windows操作系统3.4课程设计任务及要求:

(1)程序根据滑动窗口协议实现端对端数据传送。包含协议多种策略,如包丢失、停等应答、超时等都应有所仿真实现。

(2)显示数据传送过程中各项具体数据。双方帧个数改变,帧序号,发送和接收速度,暂停或重传提醒等。3.5界面要求:此次课程设计要求全部功效应可视,我们组关键是用VC++编写,运行在DOS环境下,观察发送方(sender)发送数据包到接收方(receive)时。界面应显示出双方帧个数改变,帧序号,发送和接收速度,暂停或重传提醒等,界面中必需动态显示数据帧发送和接收情况,包含在对应窗口具体显示对应ACK和其她收发数据帧后发出消息,以表明模拟协议正确运作过程。在多种情况下,接收方和发送方窗口应实时显示帧发送和接收情况,包含序号,时间戳,内容等。以及窗口填充和清空情况。

3.6网络接口要求:两台机器或是一台机器中两个独立线程模拟发送方与接收方,接收数据端口初始应为监听状态。发送方向接收方提议连接,成功后开始发送数据。4.概要设计4.1结构体定义以下:typedefenum{data=1,ack,nak,tout}frame_kind;//帧类型typedefstructframe_head{frame_kindkind;//帧类型unsignedintseq;//序列号unsignedintack;//确定号unsignedchardata[MAX_LENGTH];//数据}Head;typedefstructframe{frame_headhead;//帧头unsignedintsize;//数据大小}Frame;typedefstructframenode//队列节点类型{framehead_data;structframenode*next;}Framenode;typedefstruct{Framenode*front;//队头指针Framenode*rear;//队尾指针}LinkQueue;4.2发送方关键函数实现:函数名:voidInitLine(LinkQueue*q); 功能:初始化队列。函数名:voidGetFrameFromHost(LinkQueue*q);功能:从主机取数据帧,因为试验需要,假设主机有足够多数据帧要发送。voidDeLine(LinkQueue*q); 功能:数据帧发送完成(收到确定帧)后,删除发送数据帧(队头)。函数名:intQueueEmpty(LinkQueue*q); 功能:判定队列是否为空。函数名:frameQueueFront(LinkQueue*q); 功能:取队头,首帧是准备好待发送帧。函数名:intQueueLen(LinkQueue*q);功能:计算队列长度。函数名:DWORDWINAPIReceiveFun(LPVOIDpArg);功能:发送线程调用函数,pArg参数存接收帧指针。函数名:voidmain();功能:发送方主函数,首先和接收方(本机"127.0.0.1")建立socket连接并初始化发送队列。然后反复下面步骤:(1)从主机取数据帧;(2)发送数据帧,含超时重发(接收方未收到或未收到接收方ack)和错误重发(收到接收方nak);(3)设置超时计时器,这里是5秒;(4)等候确定,调用CreateThread()函数创建一个线程,超时则调用TerminateThread()函数结束线程并再次发送数据帧。收到数据帧则做后续处理;(5)收到否认帧nak则再次发送数据帧,收到确定帧ack则发送下一个数据帧;(6)假如发送测试时间达成20秒,则提醒是否继续测试,按‘q’或‘Q’退出测试。4.3接收方关键函数实现:函数名:voidInitLine(LinkQueue*q);功能:初始化队列。函数名:voidGetFrameFromHost(LinkQueue*q);功能:准备好接收帧缓冲池,首帧是待接收帧,尾帧是已经接收待提交主机帧。因为试验需要,假设数据帧送往主机是足够快。intDeLine(LinkQueue*q,frame*pf,unsignedintcurw)功能:将帧数据保留供提交主机,curw是打开待接收数据窗口。函数名:intQueueEmpty(LinkQueue*q);功能:判定队列是否为空。函数名:intQueueLen(LinkQueue*q);功能:计算队列长度。函数名:voidmain();功能:接收方主函数,首先和发送方建立socket连接并初始化初始化接收窗口。然后反复下面步骤:(1)等候,接收数据帧;(2)校验数据帧,假定产生结果,20%概率校验错误或发送方发送数据帧超时;(3)校验错误时,丢弃数据帧,并发送否认帧nak;(4)假如出现接收超时(假定未收到发送方发送数据帧),则不给发送发任何回应;(5)假如校验正确,首先判定是否是上一帧重发。是上一帧重发,则丢弃数据帧,并发送确定帧ack;是新数据帧,则保留数据帧到目前接收窗口,并发送确定帧ack。(6)送数据帧至主机。5.源代码5.1发送方关键代码:voidInitLine(LinkQueue*q){ q->front=q->rear=NULL;}intQueueEmpty(LinkQueue*q){ returnq->front==NULL&&q->rear==NULL;}frameQueueFront(LinkQueue*q){ if(QueueEmpty(q)){printf("队列为空!\n"); Sleep(SLEEPMS);exit(0);} returnq->front->head_data;}intQueueLen(LinkQueue*q){ if(QueueEmpty(q)){ return0;} intnum=0; Framenode*p=q->front; while(p!=NULL) { num++; p=p->next; } returnnum;}voidGetFrameFromHost(LinkQueue*q){ if(QueueLen(q)>=MAXPOOL) { printf("data%d已准备好\n",q->front->head_data.head.seq); return; } Framenode*p=(Framenode*)malloc(sizeof(Framenode)); memset(p->head_data.head.data,0,MAX_LENGTH); srand((unsigned)time(NULL)); p->head_data.size=rand()%MAX_LENGTH;//帧大小生成 memset(p->head_data.head.data,'1',p->head_data.size); p->head_data.head.ack=-1; p->head_data.head.kind=data; p->head_data.head.seq=0; p->next=NULL; if(QueueEmpty(q)) q->front=q->rear=p;//首帧是待发送帧 else { p->head_data.head.seq=(q->rear->head_data.head.seq+1)%MAXPOOL; q->rear->next=p; q->rear=p; } printf("从主机得到:data%d,放入缓存\n",p->head_data.head.seq); GetFrameFromHost(q);//因为试验需要,假设主机有足够多数据帧要发送}voidDeLine(LinkQueue*q){ Framenode*p=NULL; if(QueueEmpty(q)) { printf("队列为空!\n"); } else { p=q->front; q->front=p->next; if(q->rear==p)q->rear=NULL; printf("发送data%d,%d成功!从缓存中删除\n",p->head_data.head.seq,p->head_data.size); free(p); p=NULL; }}voidmain(){printf("建立连接...\n");Begin: WORDwVersionRequested;WSADATAwsaData;//初始化socket库 wVersionRequested=MAKEWORD(1,1);//两个byte型合并成一个WORD型 interr=WSAStartup(wVersionRequested,&wsaData); if(err!=0){ Sleep(SLEEPMS);return;} if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) {WSACleanup();//中止WindowsSockets服务WSAStartup()成对使用 Sleep(SLEEPMS);return;} socketClient=socket(AF_INET,SOCK_STREAM,0);//监听套接字 SOCKADDR_INclientadd;clientadd.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");clientadd.sin_family=AF_INET;clientadd.sin_port=htons(7001);//设置连接端IP、端口 if(SOCKET_ERROR==connect(socketClient,(SOCKADDR*)&clientadd,sizeof(SOCKADDR)))//连接 { WSACleanup(); Sleep(SLEEPMS); gotoBegin; } chargetData[RECEIVE_MAX_LENGTH]; memset(getData,0,RECEIVE_MAX_LENGTH);//清零 if(recv(socketClient,getData,RECEIVE_MAX_LENGTH,0)==SOCKET_ERROR)//接收{printf("接收连接提醒信息犯错!\n");}else{printf("%s\n",getData);} charsendData[SEND_MAX_LENGTH]; memset(sendData,0,SEND_MAX_LENGTH);strcpy(sendData,"你好接收方,我是发送方!"); if(SOCKET_ERROR==send(socketClient,sendData,strlen(sendData)+1,0))//发送{printf("发送连接提醒信息犯错!\n"); WSACleanup(); closesocket(socketClient); Sleep(SLEEPMS);return;} printf("按任意键继续!\n"); while(!kbhit()){};//等候开始 Sleep(SLEEPMS); printf("1bit滑动窗口协议:发送方,发送窗口=1\n"); LinkQueueQueueQ; InitLine(&QueueQ); framepacketsend;//data framepacketreceive;//ack,nak unsignedlongtick=GetTickCount(); intret=0; HANDLEhThread; while(1) { GetFrameFromHost(&QueueQ); //从主机取数据帧 memset(&packetsend,0,sizeof(packetsend)); Sleep(SLEEPMS); printf("\n"); packetsend=QueueFront(&QueueQ);//取数据帧 ret=send(socketClient,(char*)&packetsend,sizeof(packetsend),0);//发送data if(ret==SOCKET_ERROR) { printf("发送数据犯错!\n"); continue; }printf("发送数据帧:data%d,%d\n",packetsend.head.seq,packetsend.size); constunsignedlongtimeOut=5*1000;//设置超时计时器5秒超时 memset(&packetreceive,0,sizeof(packetreceive)); Sleep(SLEEPMS); printf("\n"); InitializeCriticalSection(&gCS);//初始化临界区 hThread=CreateThread(NULL,0,ReceiveFun,(LPVOID)&packetreceive,0,NULL); intr=WaitForMultipleObjects(1,&hThread,TRUE,timeOut); DeleteCriticalSection(&gCS);//与InitializeCriticalSection(&gCS);成对使用 if(ret==SOCKET_ERROR||ret==SOCKET_DISCONN) { printf("接收犯错!Pressanykeytocontinue\n"); while(!kbhit()){}; continue; }if(r==WSA_WAIT_TIMEOUT)//判定超时 { TerminateThread(hThread,0);//终止线程 printf("超时重传:data%d,%d\n",packetsend.head.seq,packetsend.size); }elseif(packetsend.head.seq==packetreceive.head.ack) { srand((unsigned)time(NULL)); switch(rand()%5)//假定产生结果,20%概率超时 { case0: printf("接收方发送回复超时(ack丢失模拟):%d\n",packetsend.head.seq); printf("超时重传:data%d,%d\n",packetsend.head.seq,packetsend.size); break; default: if(packetreceive.head.kind==ack) { printf("接收ack帧:ack%d\n",packetreceive.head.ack); DeLine(&QueueQ); } elseif(packetreceive.head.kind==nak) { printf("接收nak帧:nak%d\n",packetsend.head.seq); } break; } } elseprintf("帧序号犯错:%d\n",packetreceive.head.ack); if(GetTickCount()-tick>20*TIMEOUT)//设置时间20秒 { printf("连续时间20s.按q退出,其她键继续\n"); intkbc=getch(); if(kbc=='q'||kbc=='Q') break; } } printf("按任意键退出!\n"); while(!kbhit()){}; Sleep(SLEEPMS); printf("谢谢使用!\n"); WSACleanup(); closesocket(socketClient); Sleep(SLEEPMS);}DWORDWINAPIReceiveFun(LPVOIDpArg){ EnterCriticalSection(&gCS);//进入criticalsection frame*packetreceive=(frame*)pArg; ret=recv(socketClient,(char*)packetreceive,sizeof(*packetreceive),0); LeaveCriticalSection(&gCS); //线程用毕,离开criticalsection returnret;}5.2接收方关键代码:voidInitLine(LinkQueue*q){ q->front=q->rear=NULL;}intQueueEmpty(LinkQueue*q){ returnq->front==NULL&&q->rear==NULL;}frameQueueFront(LinkQueue*q){ if(QueueEmpty(q)){printf("队列为空!\n"); Sleep(SLEEPMS);exit(0);} returnq->front->head_data;}intQueueLen(LinkQueue*q){ if(QueueEmpty(q)){ return0;} intnum=0; Framenode*p=q->front; while(p!=NULL) { num++; p=p->next; } returnnum;}intGetFrameFromHost(LinkQueue*q){ if(QueueLen(q)>=MAXPOOL) { printf("准备接收:data%d\n",q->front->head_data.head.seq); returnq->front->head_data.head.seq; } Framenode*p=(Framenode*)malloc(sizeof(Framenode)); memset(p->head_data.head.data,0,MAX_LENGTH); p->head_data.head.ack=-1; p->head_data.head.kind=ack; p->head_data.head.seq=0; p->next=NULL; if(QueueEmpty(q))q->front=q->rear=p; else { p->head_data.head.seq=(q->rear->head_data.head.seq+1)%MAXPOOL; q->rear->next=p; q->rear=p; } returnGetFrameFromHost(q);}intDeLine(LinkQueue*q,frame*pf,unsignedintcurw)//假设数据帧送往主机是足够快{ Framenode*p=NULL; if(curw==q->front->head_data.head.seq) p=q->front; else p=q->rear; if(p->head_data.head.ack!=-1)//假定数据已经提交主机 { printf("向主机交付data%d,%d成功!\n",p->head_data.head.ack,p->head_data.size); } memset(p->head_data.head.data,0,MAX_LENGTH); memcpy(p->head_data.head.data,pf->head.data,pf->size); p->head_data.size=pf->size; p->head_data.head.ack=pf->head.seq;//保留发送帧序号 returnp->head_data.head.seq;}frameQueueAnswer(LinkQueue*q,unsignedintcurw){ if(curw==q->front->head_data.head.seq) { returnq->front->head_data; } else { returnq->rear->head_data; }}voidmain(){Begin:WORDwVersionRequested;WSADATAwsaData;//初始化socket库wVersionRequested=MAKEWORD(1,1);//两个byte型合并成一个WORD型interr=WSAStartup(wVersionRequested,&wsaData);//使用sockets之前要调用一次 if(err!=0){ Sleep(SLEEPMS);return;} if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1){WSACleanup();//中止WindowsSockets服务WSAStartup()成对使用 Sleep(SLEEPMS);return;} SOCKETsocksrv=socket(AF_INET,SOCK_STREAM,0);//监听套接字SOCKADDR_INsocketadd;socketadd.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//监听连接socketadd.sin_family=AF_INET;socketadd.sin_port=htons(7001);//设置端口 if(SOCKET_ERROR==bind(socksrv,(SOCKADDR*)&socketadd,sizeof(SOCKADDR))){printf("绑定犯错!\n"); WSACleanup(); Sleep(SLEEPMS);return;}if(SOCKET_ERROR==listen(socksrv,5)){printf("监听犯错!"); WSACleanup(); Sleep(SLEEPMS);return;} SOCKADDR_INsockclient;intlen=sizeof(SOCKADDR);SOCKETsockconn=accept(socksrv,(SOCKADDR*)&sockclient,&len);//建立连接套节字if(INVALID_SOCKET==sockconn){printf("建立连接犯错!\n"); WSACleanup(); Sleep(SLEEPMS);return;} charsendData[SEND_MAX_LENGTH]; memset(sendData,0,SEND_MAX_LENGTH);sprintf(sendData,"%s","你好发送方,我是接收方!");if(SOCKET_ERROR==send(sockconn,sendData,strlen(sendData)+1,0)){printf("发送连接提醒信息犯错!\n"); WSACleanup(); closesocket(sockconn); Sleep(SLEEPMS);return;} chargetData[RECEIVE_MAX_LENGTH]; memset(getData,0,RECEIVE_MAX_LENGTH);recv(sockconn,getData,RECEIVE_MAX_LENGTH,0);printf("%s\n",getData); printf("1bit滑动窗口协议:接收方,接收窗口=1\n"); LinkQueueQueueQ; InitLine(&QueueQ); framepacketreceive;//data framepacketsend;//ack,nak intcurw=GetFrameFromHost(&QueueQ);//初始化接收窗口 intret=0; while(1) { memset(&packetreceive,0,sizeof(packetreceive)); Sleep(SLEEPMS); printf("\n"); ret=recv(sockconn,(char*)&packetreceive,sizeof(packetreceive),0); if(ret==SOCKET_ERROR||ret==SOCKET_DISCONN) { if(ret==SOCKET_ERROR) { printf("连接犯错!自动连接!\n"); continue; } else { printf("连接已断开,按q退出,其她键等候新连接\n"); intkbc=getch(); if(kbc=='q'||kbc=='Q') break; else { WSACleanup(); closesocket(sockconn); Sleep(SLEEPMS); gotoBegin; } } } srand((unsigned)time(NULL)); switch(rand()%5)//假定产生结果,20%概率校验错误或接收发送方超时 { case0: printf("接收数据帧:data%d,%d,校验错误,丢弃(数据帧犯错模拟)\n",packetreceive.head.seq,packetreceive.size); memset(&packetsend,0,sizeof(packetsend)); memcpy(&packetsend,&packetreceive,sizeof(packetreceive)); packetsend.head.ack=packetreceive.head.seq; packetsend.head.seq=curw; packetsend.head.kind=nak; printf("发送否认帧:nak%d\n",packetreceive.head.seq); break; case1: packetsend.head.kind=tout; printf("发送方发送数据超时(数据帧丢失模拟):%d\n",packetreceive.head.seq); break; default: printf("接收数据帧:data%d,%d,校验正确

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论