CBN协议实现c语言

上传人:s9****2 文档编号:470469631 上传时间:2023-10-14 格式:DOC 页数:24 大小:169KB
返回 下载 相关 举报
CBN协议实现c语言_第1页
第1页 / 共24页
CBN协议实现c语言_第2页
第2页 / 共24页
CBN协议实现c语言_第3页
第3页 / 共24页
CBN协议实现c语言_第4页
第4页 / 共24页
CBN协议实现c语言_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《CBN协议实现c语言》由会员分享,可在线阅读,更多相关《CBN协议实现c语言(24页珍藏版)》请在金锄头文库上搜索。

1、中文注释编程实现一个GBN传输协议的发送方和接收方两程序,采用编程语言不限,要求能将发送接收流程以及处理方法表现出来.附源代码及注释源代码:三:GBN-CS.c#include GBN.h#include #include #include extern int TRACE ; /* 用于跟踪 */ extern int nsim ; /* 当前第5层到第4层的信息数 */ extern int nsimmax; /*msg生成数量,直到停止,生成的最大信息数 */extern float time; /时间extern int packet_correct; /包的正确到达数extern i

2、nt packet_resent; /包的重传数extern struct event *evlist; /事件int main() /主函数struct event *eventptr;/变量,结构体声明struct msg msg2give;struct pkt pkt2give;int i,j;char c; init();/初始化 A_init();/A端初始化 B_init();/B端初始化 while (1) /循环,用于每个包的传送 eventptr = evlist; /* 从模拟器得到下一个事件 */ if (eventptr=NULL)goto terminate; evl

3、ist = evlist-next;/* 从事件清单改变该事件 */ if (evlist!=NULL)evlist-prev=NULL;if (TRACE = 2)/打印与事件相关的信息printf(n事件时间: %f,eventptr-evtime);1 / 24printf( 类型: %d,eventptr-evtype);if (eventptr-evtype=0)printf(, 计时器中断: );else if (eventptr-evtype=1)printf(, 来自第五层 );elseprintf(, 来自第三层 );if (eventptr-eventity = A)/打印

4、事件实体printf( 通信实体: %d A端n,eventptr-eventity); elseprintf( 通信实体: %d B端n,eventptr-eventity); time = eventptr-evtime; /* 更新下一个事件的时间 */if (nsim=nsimmax)break; /* 当输入包个数等于生成的最大包个数,模拟器停止 */ if (eventptr-evtype = FROM_LAYER5 ) /如果事件调用来自第五层generate_next_arrival(); /* 为将来的包的到达做准备 */ /* 将相同的信息转换为字母字符串 */ j = n

5、sim % 26; for (i=0; i2)printf( 学生发送的主要数据是: );for (i=0; ieventity = A)/A端向外发送数据A_output(msg2give); 2 / 24else/B端向外发送数据B_output(msg2give); else if (eventptr-evtype = FROM_LAYER3)/如果事件调用来自第三层pkt2give.seqnum = eventptr-pktptr-seqnum; pkt2give.acknum = eventptr-pktptr-acknum; pkt2give.checksum = eventptr

6、-pktptr-checksum; for (i=0; ipktptr-payloadi;if (eventptr-eventity = A) /* A端交付包*/ A_input(pkt2give); /* 适当的实体*/else /* B端交付包*/B_input(pkt2give);free(eventptr-pktptr); /* 释放包的缓存 */else if (eventptr-evtype = TIMER_INTERRUPT)/计时器中断情况if (eventptr-eventity = A) A_timerinterrupt();elseB_timerinterrupt();

7、else /校检,防止发生不可预料事件printf(内部警告: 不可预知的事件类型! n); free(eventptr); terminate:/终止 printf( 模拟器停止在: %f s n ,从第五层发送了 %d个包n,time,nsim); printf( 正确发送包的个数: %d n, packet_correct); printf( 重发包的个数: %d n, packet_resent);3 / 24 system(pause);/暂停一GBN.h#pragma once#include /基础功能模块的数据结构声明#define BIDIRECTIONAL 1 /* 改变值

8、1如果你需要写额外的可靠程序或B输出程序(即B端系统)*/* msg结构体是由第五层(教师代码)转变成第四层的数据单元(学生代码)*/*它包括了经由第五层向学生层协议通信实体交付的数据(字符)*/struct msg char data20;/* pkt结构体是第4层(学生代码)向第3层传送的数据单元(老师代码)。值得注意的是预先定义的包结构,这一切学生必须遵守。*/struct pktint seqnum;/顺序号int acknum;/应答号int checksum;/检查和char payload20;#define WINDOWSIZE 8 /定义滑动窗口大小#define MAXBU

9、FSIZE 50/最大窗口大小#define RTT 15.0/周游时间#define NOTUSED 0/没用到#define NACK -1/否定应答#define TRUE 1#define FALSE 0#define A 0#define B 1/网络仿真部分数据结构声明*struct event4 / 24float evtime; /* 事件时间 */int evtype; /* 事件类型 */int eventity; /* 事件实体*/struct pkt *pktptr; /* 指向这个事件的指针(如果需要) */struct event *prev; /前一事件struc

10、t event *next; /后一事件 ;/* possible events: */#define TIMER_INTERRUPT 0 /事件中断#define FROM_LAYER5 1 /来自第五层#define FROM_LAYER3 2 /来自第三层#define OFF 0#define ON 1/基础功能模块的函数声明*void ComputeChecksum(struct pkt *packet);/计算校验和int CheckCorrupted(struct pkt packet);/检查数据是否出错void A_output( struct msg message);/A端向外发送数据void A_input(struct pkt packet);/A端接收数据void A_timerinterrupt();/A计时器超时void A_init();/A端初始化void B_output(struct msg message); void B_input(struct pkt packet);void B_timerinterrupt();void B_init();/网络仿真部分的函数声明*void init(); /初始化仿真器float jimsrand();/随机数发生器0,1/处理事件列表部分的函数声明*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号