ab
include<stdio.h> #include<sys/types.h> #include<netinet/in.h> #include<netdb.h> #include<stdlib.h> #include<sys/socket.h> #include<unistd.h> #include<string.h> #include<arpa/inet.h> #include<sys/stat.h>
#define cls() printf("Clearing")
IET/IT DEPARTMENT
COMPUTER NETWORK
//structure definition for designing the packet.
struct frame {
int packet[40];
};
//structure definition for accepting the acknowledgement.
struct ack {
int acknowledge[40]; };
int main() {
int serversocket;
struct sockaddr_in serveraddr,clientaddr; socklen_t len;
struct frame f1;
int windowsize,totalpackets,totalframes,i=0,j=0,framessend=0,k,m,n,l; int repacket[40];
struct ack acknowledgement;
char req[50];
serversocket=socket(AF_INET,SOCK_DGRAM,0); bzero((char*)&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(5018); serveraddr.sin_addr.s_addr=INADDR_ANY; bind(serversocket,(struct sockaddr*)&serveraddr,sizeof(serveraddr)); bzero((char*)&clientaddr,sizeof(clientaddr));
len=sizeof(clientaddr);
//connection establishment.
printf("\nWaiting for client connetion \n"); recvfrom(serversocket,req,sizeof(req),0,(struct sockaddr*)&clientaddr,&len);
printf("\nClient connection obtained\t%s\n",req);
//sending request for windowsize.
printf("\nSending request for window size\n");
sendto(serversocket,"REQUEST FOR WINDOW SIZE",sizeof("REQUST FOR WINDOW"),
0,(struct sockaddr*)&clientaddr,sizeof(clientaddr));
//obtaining windowsize.
printf("\nWaiting for the window size\n"); recvfrom(serversocket,(char*)&windowsize,sizeof(windowsize),
0,(struct sockaddr*)&clientaddr,&len);
cls();
printf("The window size obtained as: \t%d\n",windowsize); printf("\nObtaining packets from network layer\n");
IET/IT DEPARTMENT
COMPUTER NETWORK
printf("\nTotal packets obtained \t%d\n",(totalpackets=windowsize*5));
printf("\nTotal frames or windows to be transmitted\t%d\n",(totalframes=5));
//sending details to client.
printf("\nSending total number of packets\n");
sendto(serversocket,(char*)&totalpackets,sizeof(totalpackets),
0,(struct sockaddr*)&clientaddr,sizeof(clientaddr));
recvfrom(serversocket,req,sizeof(req),0,(struct sockaddr*)&clientaddr,&len); printf("\nSending total number of frames\n"); sendto(serversocket,(char*)&totalframes,sizeof(totalframes),
0,(struct sockaddr*)&clientaddr,sizeof(clientaddr)); recvfrom(serversocket,req,sizeof(req),0,(struct sockaddr*)&clientaddr,&len);
printf("\nPress enter to start the process\n"); fgets(req,2,stdin);
cls();
j=0;
l=0;
//starting the process of sending
while(l<totalpackets)
{
//initialising the transmit buffer.
bzero((char*)&f1,sizeof(f1));
printf("Initializing the transmit buffer \n");
printf("The frame to be send is %d with packets\n",framessend);
//Builting the frame.
for(m=0;m<j;m++)
{
//including the packets for which negative acknowledgement was received.
printf("%d",repacket[m]); f1.packet[m]=repacket[m];
}
while(j<windowsize && i<totalpackets)
{
printf("%d",i);
f1.packet[j]=i; i++;
j++;
printf("Sending frame %d\n",framessend);
//sending the frame.
sendto(serversocket,(char*)&f1,sizeof(f1),
}
0,(struct sockaddr*)&clientaddr,sizeof(clientaddr));
//Waiting for the acknowledgement.
printf("Waiting for the acknowledgement\n");
IET/IT DEPARTMENT
COMPUTER NETWORK
recvfrom(serversocket,(char*)&acknowledgement,sizeof(acknowledgement), 0,(struct sockaddr*)&clientaddr,&len);
cls();
//Checking acknowledgement of each packet.
j=0;
m=0;
k=0;
n=1;
while(m<windowsize && n<totalpackets) {
if(acknowledgement.acknowledge[m]==-1)
{
printf("\nNegetive acknowledgement received for packet:%d\n",
k=1;
f1.packet[m]);
repacket[j]=f1.packet[m]; j++;
}
else
{
l++;
} m++; n++;
}if(k==0) {
printf("\nPositive,acknowledgement recived for all packets, waiting for frame:%d\n",framessend);
}
framessend++;
printf("\nPress enter to proceed\n");
}
fgets(req,2,stdin);
cls(); }
printf("All frames sends successfully,.\nClosing connection with the client()");
close(serversocket);