Tuesday, October 25, 2011

NETWORK LAB-SLIDING WINDOW PROTOCOL-SELECTIVE REPEAT N ARQ


               SELECTIVE REPEAT AND ARQ
SENDER SIDE:-
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
int converttoframes(char *n,char data[100][100],int power)
{ FILE *fp;
int k=0,i;
fp=fopen(n,"r");
while(!feof(fp))
{ data[k][0]=k%power+48;
for(i=1;i<9;i++)
data[k][i]=fgetc(fp);
data[k++][i]='\0'; } return (k-1); }

int main(int argc,char **argv)
{ int len,bits,frames,errbit,once;
int sws,lfs,lar;
int sockfd;
int n,l=0,i,j=0,choice=0,k,pre=0;
int flag=-1,count,re=0,ch=0;
struct sockaddr_in servaddr,cliaddr;
char data[100][100],ack[1];
char buff[100][100],buff1[10];
char name[50];
int *recvd,power=1,gla=0;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
perror("Cannot create a socket");
bzero(&servaddr,sizeof(servaddr));
bzero(&buff[0],sizeof(buff[0]));
bzero(&buff1,sizeof(buff1));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
servaddr.sin_port=htons(7995);
connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
printf("Enter the window size:-");
scanf("%d",&sws);
printf("Enter the file name:-");
scanf("%s",name);

for(i=0;i<sws;i++)
power*=2;
frames=converttoframes(name,data,power);
recvd=(int *)malloc(sizeof(int)*sws);
recvd[-1]=1;
for(i=0;i<sws;i++)
recvd[i]=-1;
while(choice!=6)
{ flag=-1;
count=0;
for(i=0;i<sws;i++)
recvd[i]=-1;
printf("\n\t~~Choose cases~~\n1.Normal\t2.Ack Lost\t3.Data Lost\n4.Delayed Ack\t5.Wrong Data\t6.Exit\tChoice : ");
scanf("%d",&choice);
//printf("\n");
switch(choice)
{ case 1:
for(k=0;k<frames;k++)
{ j=0;
strcpy(buff[k],data[k]);
for(i=1;i<strlen(buff[k]);i++)
{ if(buff[k][i]=='1')
j++; }
if(j%2==0)
buff[k][i++]='0';
else
buff[k][i++]='1';
buff[k][i]='\0';
send(sockfd,buff[k],strlen(buff[k]),0);
recv(sockfd,ack,1,0);
lfs=k%power;
printf("\nLast frame sent:-%d",lfs);
lar=atoi(ack);
recvd[lar]=lar;
if(count==sws-1)
{ printf("\nACK:-");
printf("%d",lar); }
else if(count==sws)
count=0;
count++; }
break;
case 2: lar=0;
for(k=0;k<frames+1;k++)

{ if(k==frames && recvd[count-1]!=-1)
break;
once=0;
j=0;
strcpy(buff[k],data[k]);
for(i=1;i<strlen(buff[k]);i++)
{ if(buff[k][i]=='1')
j++; }
if(j%2==0)
buff[k][i++]='0';
else
buff[k][i++]='1';
buff[k][i]='\0';
if(count<sws)
{ if(flag!=-1)
{ wait(10);
printf("\nTIME OUT!!!"); }
send(sockfd,buff[k],strlen(buff[k]),0);
recv(sockfd,ack,1,0);
lfs=k%power;
printf("\nLast frame sent:-%d",lfs);
if(count==sws-1)
{ printf("\nAck lost?-1/0:-");
scanf("%d",&once); }
if(once==1)
recvd[count]=-1;
else
{ lar=atoi(ack);
recvd[count]=lar; }
if(once!=1 && count==sws-1)
{ if(ack[0]!='n')
{ printf("\nACK:-");
printf("%d",lar); }
else
{ printf("\nNAK:-");
printf("%d",lfs); } }
count++;
if(flag!=-1)
{ k=flag-1;
flag=-1;
count=0; } }
else
{ for(i=0;i<sws;i++)
{ if(recvd[i]==-1)

{ flag=k;
if(k>sws)
k=i-1+sws;
else
k=i-1;
count=count-1; } }
if(flag==-1)
{ for(i=0;i<sws;i++)
recvd[i]=-1;
count=0;
k=k-1; } }
bzero(&buff[k+1],sizeof(buff[k+1])); }
//bzero(&recvd,sizeof(recvd));
break;
case 3:
lar=0;
count=0;
for(k=0;k<frames+1;k++)
{
j=0;
if(k==frames && recvd[count-1]!=-1 && recvd[count-2]!=-1)
break;
strcpy(buff[k],data[k]);
for(i=1;i<strlen(buff[k]);i++)
{
if(buff[k][i]=='1')
j++;
}
if(j%2==0)
buff[k][i++]='0';
else
buff[k][i++]='1';
buff[k][i]='\0';
if(count<sws)
{
send(sockfd,buff[k],strlen(buff[k]),0);
recv(sockfd,ack,1,0);
lfs=k%power;
printf("\nLast frame sent:-%d",lfs);
if(ack[0]!='n')
{
lar=atoi(ack);
recvd[count]=lar;
}

else
recvd[count]=-1;
if(ack[0]!='n' && count==sws-1 && recvd[gla]!=-1)
{
printf("\nACK:-");
if(lar<frames-1)
printf("%d",lar+1);
else
printf("%d",lar);
}
else if(count==sws-1)
{
printf("\nNAK:-");
if(recvd[gla]==-1)
printf("%d",lfs-1);
else if(recvd[count]==-1)
printf("%d",lfs);
}
count++;
if(flag!=-1)
{
k=flag-1;
flag=-1;
count=0;
gla=0;
}
}
else
{
for(i=0;i<sws;i++)
{
if(recvd[i]==-1)
{
flag=k;
if(k>sws)
k=i-1+sws;
else
k=i-1;
if(i==0)
gla=1;
count=count-1;
}
}
if(flag==-1)

{ for(i=0;i<sws;i++)
recvd[i]=-1;
count=0;
k=k-1; } }
bzero(&buff[k+1],sizeof(buff[k+1])); }
//bzero(&recvd,sizeof(recvd));
break;
case 4:
lar=0;
for(k=0;k<frames+1;k++)
{ j=0;
once=0;
if(k==frames && recvd[count-1]!=-1)
break;
strcpy(buff[k],data[k]);
for(i=1;i<strlen(buff[k]);i++)
{ if(buff[k][i]=='1')
j++; }
if(j%2==0)
buff[k][i++]='0';
else
buff[k][i++]='1';
buff[k][i]='\0';
if(count<sws)
{ if(flag!=-1)
{ wait(10);
printf("\nTIME OUT!!!"); }
send(sockfd,buff[k],strlen(buff[k]),0);
recv(sockfd,ack,1,0);
if(count==sws-1)
{printf("\nAck delayed?-1/0:-");
scanf("%d",&once); }
if(once==1)
recvd[count]=-1;
else
{ lar=atoi(ack);
recvd[count]=lar; }
if(once!=1 && count==sws-1)
{ if(ack[0]!='n')
{ printf("\nACK : ");
printf("%d",lar); }
else
{ printf("\nNAK:-");
printf("%d",lfs); } }
count++;
if(flag!=-1)
{
k=flag-1;
flag=-1;
count=0; } }
else
{ for(i=0;i<sws;i++)
{ if(recvd[i]==-1)
{ flag=k;
if(k>sws)
k=i-1+sws;
else
k=i-1;
count=count-1; } }
if(flag==-1)
{ for(i=0;i<sws;i++)
recvd[i]=-1;
count=0;
k=k-1; } }
bzero(&buff[k+1],sizeof(buff[k+1])); }
//bzero(&recvd,sizeof(recvd));
break;
case 5:
count=0;
lar=0;
flag=0;
for(k=0;k<frames;k++)
{ j=0;
strcpy(buff1,data[k]);
for(i=1;i<strlen(buff1);i++)
{ if(buff1[i]=='1')
j++; }
if(j%2==0)
buff1[i++]='0';
else
buff1[i++]='1';
buff1[i]='\0';
printf("\nWanna introduce Error?-yes/no:-");
scanf("%d",&ch);
if(ch==1)
{ printf("\nIn which position to introduce error? ");
scanf("%d",&errbit);
if(buff1[errbit]=='1')
buff1[errbit]='0';
else
buff1[errbit]='1';
flag=buff1[0]-48;
if(flag<0)
flag+=48; }
send(sockfd,buff1,strlen(buff1),0);
recv(sockfd,ack,1,0);
lfs=k%power;
if(count==sws-1)
{ if(ack[0]!='n' && flag==0 && lar!=0)
{ printf("\nACK:-");
printf("%d",lar); }
else
{ printf("\nNAK:-");
printf("%d",flag);
flag=0; }
count=-1; }
else
if(ack[0]!='n')
flag=1;
count++;
lar=ack[0]-48;
if(lar<0)
lar+=48;
bzero(&buff1,sizeof(buff1)); }
l=0;
break;
case 6:
buff[0][1]='!';
send(sockfd,buff[0],1,0);
break; } }
shutdown(sockfd,SHUT_RDWR);
return 0; }

RECEIVER SIDE:-
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
int main(int argc,char **argv)
{ int sockfd,newfd,len,count=0;
struct sockaddr_in servaddr,cliaddr;
int i,j=0,n,once=0;
int *recvd;
char s[10],ack[1];
int rws,lfr=0,mult;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
perror("Cannot create socket");
bzero(&servaddr,sizeof(servaddr));
bzero(&s,sizeof(s));

servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(7995);
servaddr.sin_addr.s_addr=inet_addr(argv[1]);

if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
perror("Bind error");
listen(sockfd,2);
len=sizeof(&cliaddr);
newfd=accept(sockfd,(struct sockaddr*)&cliaddr,&len);
bzero(&s,sizeof(s));
printf("Enter the window size:-");
scanf("%d",&rws);
mult=rws*2;
recvd=(int *)malloc(sizeof(int)*mult);
printf("Expecting frame:-%d",lfr);
recv(newfd,s,sizeof(s),0);

while(strcmp(s,"!"))
{ printf("\n");
j=0;
printf("\nData:-%s",s);
recvd[lfr]=lfr;

for(i=1;i<strlen(s);i++)
{ if(s[i]=='1')
j=j+1; }

if(j%2==0)
ack[0]=lfr+48;
else
ack[0]='n';
printf("\nData lost?-1/0:-");
scanf("%d",&once);
if(once==1)
ack[0]='n';
send(newfd,ack,1,0);
bzero(&s,sizeof(s));
recv(newfd,s,sizeof(s),0);
lfr=s[0]-48;
if(lfr<0)
lfr+=48;
printf("Expecting frame:-%d",lfr); }
shutdown(sockfd,SHUT_RDWR);
shutdown(newfd,SHUT_RDWR);
return 0; }

INPUT FILE:-
11110000111100000000111100001111

No comments:

Post a Comment