计算机网络原理GBN协议代码

更新时间:2023-10-01 23:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、 GBN.h

#pragma once

#include

//基础功能模块的数据结构声明

#define BIDIRECTIONAL 1 /* change to 1 if you're doing extra credit and write a routine called B_output */

/* a \4 (students' code). It contains the data (characters) to be delivered to layer 5 via the students transport level protocol entities. */ struct msg

{ char data[20]; };

/* a packet is the data unit passed from layer 4 (students code) to layer 3 (teachers code). Note the pre-defined packet structure, which all students must follow. */ struct pkt { int seqnum; int acknum; int checksum; char payload[20]; };

#define WINDOWSIZE 8 #define MAXBUFSIZE 50 #define RTT 15.0 #define NOTUSED 0 #define NACK -1 #define TRUE 1 #define FALSE 0 #define A 0 #define B 1 //网络仿真部分数据结构声明*********************************************************** struct event { float evtime; /* event time */ int evtype; /* event type code */ int eventity; /* entity where event occurs */ struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */ struct event *prev;

struct 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] //处理事件列表部分的函数声明*********************************************

void generate_next_arrival();//产生下一个到达的分组

void insertevent(struct event *p);//向事件列表中插入一条新的事件 void printevlist();//打印事件列表

//********************************************************************

//**********************计时器模块*********************************** void stoptimer(int);//停止计时器

void starttimer(int,float);//启动计时器

//*********************************************************************

//**************************网络各层之间传送模块***********************

void tolayer3(int AorB,struct pkt packet);//向第3层发送信息 void tolayer5(int AorB,char datasent[20]);//向第5层发送信息 二、 GBN.c

#include \#include #include #include

extern int TRACE = 1; /* for my debugging */

extern int nsim = 0; /* number of messages from 5 to 4 so far */

extern int nsimmax = 0; /* number of msgs to generate, then stop */

extern float time = 0.000;

float lossprob; /* probability that a packet is dropped */ float corruptprob; /* probability that one bit is packet is flipped */

float lambda; /* arrival rate of messages from layer 5 */ int ntolayer3; /* number sent into layer 3 */

static int nlost = 0; /* number lost in media */

static int ncorrupt = 0; /* number corrupted by media*/

static int expectedseqnum = 0; /* expected sequence number at receiver side */

static int nextseqnum; /* next sequence number to use in sender side */

static int base; /* the head of sender window */

struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */

static int winfront,winrear; /* front and rear points of window buffer */

static int pktnum; /* packet number of window buffer */

struct msg buffer[MAXBUFSIZE]; /* sender message buffer */

int buffront,bufrear; /* front and rear pointers of buffer */ static int msgnum; /* message number of buffer */

int packet_lost =0; int packet_corrupt=0; int packet_sent =0;

extern int packet_correct=0; extern int packet_resent =0; int packet_timeout=0;

extern struct event *evlist = NULL; /* the event list */

//计算校验和

void ComputeChecksum( struct pkt *packet) { int checksum; int i; checksum = packet->seqnum; checksum = checksum + packet->acknum; for ( i=0; i<20; i++ )

checksum = checksum + (int)(packet->payload[i]); checksum = 0-checksum; packet->checksum = checksum; }

//检查是否出错

int CheckCorrupted(struct pkt packet) { int checksum; int i; checksum = packet.seqnum; checksum = checksum + packet.acknum; for ( i=0; i<20; i++ )

checksum = checksum + (int)(packet.payload[i]); if ( (packet.checksum+checksum) == 0 ) return (FALSE); else return (TRUE); }

//A端向外发送数据

/* called from layer 5, passed the data to be sent to other side */ void A_output(struct msg message) { int i; struct pkt sendpkt; /* if window is not full */ if ( nextseqnum < base+WINDOWSIZE ) { printf(\New message arrives, send window is not full, send new messge to layer3!\\n\ /* create packet */ sendpkt.seqnum = nextseqnum; sendpkt.acknum = NOTUSED; for ( i=0; i<20 ; i++ ) sendpkt.payload[i] = message.data[i];

本文来源:https://www.bwwdw.com/article/vxtd.html

Top