Sie sind auf Seite 1von 5

/* Stop and Wait protocol*/

#include<iostream.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#define
#define
#define
#define

TIMEOUT 5
MAX_SEQ 1
TOT_PACKETS 8
inc(k) if(k<MAX_SEQ) k++;else k=0;

typedef struct
{
int data;
}packet;
typedef struct
{
int kind;
int seq;
int ack;
packet info;
int err;
}frame;
frame data;
typedef enum{
frame_arrival,err,timeout,no_event
}event_type;
void
void
void
void
void
void
void
void

from_network_layer(packet *);
to_network_layer(packet *);
to_physical_layer(frame *);
from_physical_layer(frame *);
wait_for_event_sender(event_type *);
wait_for_event_receiver(event_type *);
receiver();
sender();

int i=1;
char turn;
int DISCONNECT=0;
void main()
{
clrscr();
randomize();
while(!DISCONNECT)
{
sender();
delay(400);
receiver();
}
getch();
}

void sender()
{
static int frame_to_send=0;
static frame s;
packet buffer;
event_type event;
static int flag=0;
if(flag==0)
{
from_network_layer(&buffer);
s.info=buffer;
s.seq=frame_to_send;
cout<<"Sender : info = "<<s.info.data<<endl;
cout<<"Sender : seq no. ="<<s.seq<<endl;
turn = 'r';
to_physical_layer(&s);
flag = 1;
}
wait_for_event_sender(&event);
if(turn=='s')
{
if(event==frame_arrival)
{
from_network_layer(&buffer);
inc(frame_to_send);
s.info=buffer;
s.seq=frame_to_send;
cout<<"Sender : info = "<<s.info.data<<endl;
cout<<"Sender : seq no. ="<<s.seq<<endl;
turn = 'r';
to_physical_layer(&s);
}
if(event==timeout)
{
cout<<"Sender : resending frame "<<endl;
turn = 'r';
to_physical_layer(&s);
}
}
}
void receiver()
{
static int frame_expected=0;
frame r,s;
event_type event;
wait_for_event_receiver(&event);
if(turn=='r')
{
if(event==frame_arrival)
{
from_physical_layer(&r);
if(r.seq==frame_expected)

{
to_network_layer(&r.info);
inc(frame_expected);
}
else
cout<<"Receiver : acknowledgement resent"<<endl;
turn = 's';
to_physical_layer(&s);
}
if(event==err)
{
cout<<"Receiver : garbled frame"<<endl;
turn = 's';
}
}
}
void from_network_layer(packet *buffer)
{
(*buffer).data = i;
i++;
}
void to_physical_layer(frame *s)
{
s->err = random(4);
data = *s;
}
void to_network_layer(packet *buffer)
{
cout<<"Receiver : packet received,ack sent
if(i>TOT_PACKETS)
{
DISCONNECT = 1;
cout<<"DISCONNECTED"<<endl;
}
}
void from_physical_layer(frame *buffer)
{
*buffer = data;
}

:-"<<(*buffer).data<<endl;

void wait_for_event_sender(event_type *e)


{
static int timer=0;
if(turn=='s')
{
timer++;
if(timer==TIMEOUT)
{
*e =timeout;
cout<<"Sender: ack not received=> TIMEOUT"<<endl;
timer = 0;
return;
}
if(data.err==0)
*e=err;
else
{

timer = 0;
*e = frame_arrival;
}
}
}
void wait_for_event_receiver(event_type *e)
{
if(turn == 'r')
{
if(data.err==0)
*e=err;
else
*e=frame_arrival;
}
}

/* OUTPUT
Sender : info = 1
Sender : seq no. =0
Receiver : packet received,ack sent
Sender: ack not received=> TIMEOUT
Sender : resending frame
Receiver : acknowledgement resent
Sender : info = 2
Sender : seq no. =1
Receiver : garbled frame
Sender: ack not received=> TIMEOUT
Sender : resending frame
Receiver : packet received,ack sent
Sender : info = 3
Sender : seq no. =0
Receiver : packet received,ack sent
Sender : info = 4
Sender : seq no. =1
Receiver : packet received,ack sent
Sender : info = 5
Sender : seq no. =0
Receiver : packet received,ack sent
Sender: ack not received=> TIMEOUT
Sender : resending frame
Receiver : acknowledgement resent
Sender : info = 6
Sender : seq no. =1
Receiver : packet received,ack sent
Sender : info = 7
Sender : seq no. =0
Receiver : packet received,ack sent
Sender: ack not received=> TIMEOUT
Sender : resending frame

:-1

:-2
:-3
:-4
:-5

:-6
:-7

Receiver : acknowledgement resent


Sender : info = 8
Sender : seq no. =1
Receiver : packet received,ack sent
DISCONNECTED
*/

:-8

Das könnte Ihnen auch gefallen