Simulate and implement selective repeat sliding window protocol.


#include<iostream>
using namespace std;
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define TOT_FRAMES 500
#define FRAMES_SEND 10

class sel_repeat
{
private:
int fr_send_at_instance;
int arr[TOT_FRAMES];
int send[FRAMES_SEND];
int rcvd[FRAMES_SEND];
char rcvd_ack[FRAMES_SEND];
int sw;
int rw;

public:

void input();
void sender(int);
void receiver(int);

};

void sel_repeat::input()
{
int n;

int m;
int i;

cout<<"Enter the no. of bits for the
sequence no. : ";
cin>>n;
m=pow(2,n);
int t=0;

fr_send_at_instance=(m/2);

for(i=0;i<TOT_FRAMES;i++)
{
arr[i]=t;
t=(t+1)%m;
}

for(i=0;i<fr_send_at_instance;i++)
{
send[i]=arr[i];
rcvd[i]=arr[i];
rcvd_ack[i]=
'n';

}

rw=sw=fr_send_at_instance;
sender(m);
}

void sel_repeat::sender(int m)

{
for(int i=0;i<fr_send_at_instance;i++)
{
if(rcvd_ack[i]==
'n')

cout<<"SENDER : Frame

"<<send[i]<<" is sent\n";
}
receiver(m);
}

void sel_repeat::receiver(int m)
{
time_t t;
int f;
int j,i=0;
int f1;
int a1;
char ch;

srand((unsigned)time(&t));

for(int i=0;i<fr_send_at_instance;i++)
{
if(rcvd_ack[i]==
'n')

{
f=rand()%10;
if(f!=5)
{
for(j=0;j<fr_send_at_instance;j++)

if(rcvd[j]==send[i])
{

cout<<"reciever:Frame"<<rcvd[j]<<"recieve
d correctly\n";

rcvd[j]=arr[rw];
rw=(rw+1)%m;
break;

}
if(j==fr_send_at_instance)
cout<<"reciever:Duplicate
frame"<<send[i]<<"discarded\n";

a1=rand()%5;
if(a1==3)
{

cout<<"(acknowledgement

"<<send[i]<<" lost)\n";

cout<<"(sender timeouts--

>Resend the frame)\n";

rcvd_ack[i]=
'n';

}
else

{
cout<<"(acknowledgement

"<<send[i]<<" recieved)\n";

rcvd_ack[i]=
'p';

}

}

}
else
{
int ld=rand()%2;
if(ld==0)
{
cout<<"RECEIVER : Frame

"<<send[i]<<" is damaged\n";

cout<<"RECEIVER : Negative

Acknowledgement "<<send[i]<<" sent\n";

}
else
{
cout<<"RECEIVER : Frame

"<<send[i]<<" is lost\n";

cout<<"(SENDER TIMEOUTS--

>RESEND THE FRAME)\n";

}
rcvd_ack[i]=
'n';

}

}

for(j=0;j<fr_send_at_instance;j++)
{

if(rcvd_ack[j]==
'n')

break;

}

for(int k=j;k<fr_send_at_instance;k++)

{

send[i]=send[k];
if(rcvd_ack[k]==
'n')

rcvd_ack[i]=
'n';

else
rcvd_ack[i]=
'p';

i++;

}

if(i!=fr_send_at_instance)

{

for(int k=i;k<fr_send_at_instance;k++)

{

send[k]=arr[sw];

sw=(sw+1)%m;
rcvd_ack[k]=
'n';

}

}
cout<<"Want to continue";
cin>>ch;
cout<<"\n";
if(ch==
'y')

sender(m);
else
exit(0);

}

int main()
{
sel_repeat sr;
sr.input();

getch();
return 0;
}

Output:-

Comments