10.selective Repeat: Data Structures and Functions

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 9

10.

Selective Repeat
Problem Description
This program is a simulation of Selective Repeat Sliding window protocol.Afterestablishing connection, the server sends 10 packetsto the client. For thisnonblocking send is used i.e., the packets are sent continuously without waiting fortheACK. If the packet is received successfully, an acknowledgement message issentback by the client. For simulation purpose, packet 3 is supposed to be lost for thefirsttime. Then client sends a RETRANSMIT request along with the currentpacket number. On receiving this, the server retransmits the 3rd packet. After that itresumessending packets from where it stopped.

Data Structures and Functions


Client

Sockfd and newSockFd are integer socket descriptors.currentPacket is aninteger that denotes the packet that is sent last.Digit is used tostore the packet no for ACK or Retransmit message.
Server Sockfd and newSockFd are integer socket descriptors.WindowStart and WindowEnd are used to store the starting and ending ofwindow.Data is a string that is used to store themessage.

Algorithm
Server

1. Start 2. Establish connection (recommended UDP) 3. Accept the window sizefrom the client (should be <= 40) 4. Accept the packet from the network layer 5. Calculate the total frames / windows required 6. Send the details to the client (total packets, total frames.) 7. Initialize the transmit buffer 8. Built the frame / window depending on the window size 9. Transmit the frame 10. Wait the acknowledgment frame 11. Check for the acknowledgment of each packet and repeat the process from thepacket for which the first negative acknowledgment is received.Else continue as usual 12. Increment the frame count and repeat steps 7 to 12 until all packets aretransmitted 13. Close the connection

14. Stop. Client

1. Start 2. Establish a connection. (RecommendedUDP ) 3. Send the windowsize on server request 4. Accept the details from the server (totalpackets, total frames) 5. Initialize the receive buffer with the expected packets 6. Accept the frame / window from the server. 7. Check the validity of the packet and construct the acknowledgment frame dependingonthe validity. (Herethe acknowledgment is accepted from the users ) 8. Depending on the acknowledgment frame readjust the process 9. Increment the frame count and repeat steps 5-9 until all packets are received 10. Close the connection 11. Stop. C o d e /*********//* SELECTIVE REJECT CLIENT *//************* /#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 3599 int main() { int sockfd, newSockFd, size, firstTime = 1, currentPacket, wait = 3; char data[100], digit[2]; struct sockaddr_in client; memset(&client, 0, sizeof(client)); sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { printf("Error in socket creation..."); } else {

printf("\nSocket Created..."); } client.sin_family = AF_INET; client.sin_port = PORT; client.sin_addr.s_addr = inet_addr("127.0.0.1"); printf("\nStarting up..."); size = sizeof(client); printf("\nEstablishing Connection..."); if(connect(sockfd, (struct sockaddr *)&client, size) == -1) { printf("\nError in connecting to server..."); exit(1); } else{printf("\nConnection Established!"); } memset(&data, 0, sizeof(data)); sprintf(data, "REQUEST"); if(send(sockfd, data, strlen(data), 0) == -1) { printf("Error in sending request for data..."); exit(1); } do{memset(&data, 0, sizeof(data)); recv(sockfd, data, 100, 0); currentPacket = atoi(data); printf("\nGot packet: %d", currentPacket); if(currentPacket == 3 && firstTime) { printf("\n*** Simulation: Packet data corrupted orincomplete."); printf("\n*** Sending RETRANSMIT."); memset(&data, 0, sizeof(data)); sprintf(data, "R3"); if(send(sockfd, data, strlen(data), 0) == -1) { printf("\nError in sending RETRANSMIT..."); exit(1); } firstTime = 0; } else

{ wait--; if(!wait) { printf("\n*** Packet Accepted -> Sending ACK"); wait = 3; memset(&data, 0, sizeof(data)); sprintf(data, "A"); digit[0] = (char)(currentPacket + 48);digit[1] = '\0'; strcat(data, digit); send(sockfd, data, strlen(data), 0); } } } while(currentPacket != 9); printf("\nAll packets recieved... Exiting.");close(sockfd);return(0); }

/********//* SELECTIVE REJECT SERVER *//************** /#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <fcntl.h> #define PORT 3599 void itoa(int number, char numberString[]) { numberString[0] = (char)(number + 48); numberString[1] = '\0'; } int main() { int sockfd, newSockFd, size, windowStart = 1, windowCurrent = 1,windowEnd = 4, oldWindowStart, flag; char buffer[100]; socklen_t len; struct sockaddr_in server, client; memset(&server, 0, sizeof(server)); memset(&client, 0, sizeof(client)); if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("\nError in socket creation..."); exit(1); } else { printf("\nSocket created successfully..."); } server.sin_family = AF_INET; server.sin_port = PORT; server.sin_addr.s_addr = INADDR_ANY; printf("\nStarting up...");

if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1) { printf("\nBinding Error..."); exit(1); } else { printf("\nBinding completed successfully. Waiting forconnection.."); } len = sizeof(client); if(listen(sockfd, 20) != -1) { if((newSockFd = accept(sockfd, (struct sockaddr *)&client,&len)) == -1) { printf("Error in accepting connection..."); exit(1); } memset(&buffer, 0, sizeof(buffer)); if(recv(newSockFd, buffer, 100, 0) == -1) { printf("\n Recieve Error! Exiting..."); exit(1); } fcntl(newSockFd, F_SETFL, O_NONBLOCK); printf("\nRecieved a request from client. Sending packets oneby one..."); do { if(windowCurrent != windowEnd) { memset(&buffer, 0, sizeof(buffer)); itoa(windowCurrent, buffer); send(newSockFd, buffer, 100, 0); printf("\nPacket Sent: %d", windowCurrent); windowCurrent++; } /*DEBUG*/ printf("\n**%d||%d**", windowCurrent,windowEnd); memset(&buffer, '\0', sizeof(buffer)); if(recv(newSockFd, buffer, 100, 0) != -1) { if(buffer[0] == 'R') {

printf("\n** Received a RETRANSMIT packet.Resending packet no. %c...", buffer[1]); itoa((atoi(&buffer[1])), buffer); send(newSockFd, buffer, 100, 0); } else if(buffer[0] == 'A') {oldWindowStart = windowStart; windowStart = atoi(&buffer[1]) + 1; windowEnd += (windowStart -oldWindowStart); printf("\n** Recieved ACK %c. Moving windowboundary.", buffer[1]); } } sleep(1); } while(windowCurrent != 10); } else {printf("\nError in listening..."); exit(1); } close(sockfd); close(newSockFd); printf("\nSending Complete. Sockets closed. Exiting...\n");return(0); }

Sample Input and Output


[root@Linux smtp]#gcc o selrejc selrejc.c [root@Linux smtp]#gcc o selrejs selrejs.c [root@Linux smtp]#./selrejs [root@Linux smtp]#./selrejc Server

Socket created successfully... Starting up... Binding completed successfully. Waiting for connection.. Recieved a request from client. Sending packets one by one... Packet Sent: 1 **2||4** Packet Sent: 2 **3||4** Packet Sent: 3 **4||4** **4||4** ** Received a RETRANSMIT packet. Resending packet no. 3... **4||4** ** Recieved ACK 3.Moving window boundary. Packet Sent: 4 **5||7** Packet Sent: 5 **6||7** Packet Sent: 6 **7||7** **7||7** ** Recieved ACK 6.Moving window boundary. Packet Sent: 7 **8||10** Packet Sent: 8 **9||10** Packet Sent: 9 **10||10** Sending Complete. Sockets closed. Exiting...

Client

Socket Created...Starting up.. .Establishing Connection... Connection Established! Got packet: 1 Got packet: 2 Got packet: 3 *** Simulation: Packet data corrupted or incomplete.*** Sending RETRANSMIT .Got packet: 3 *** Packet Accepted -> Sending ACK Got packet: 4 Got packet: 5 Got packet: 6 *** Packet Accepted -> Sending ACK Got packet: 7 Got packet: 8 Got packet: 9 *** Packet Accepted -> Sending ACK All packets recieved...Exiting.

You might also like