Advertisement
Bewin

Selective Repeat Server

Mar 24th, 2025
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <netdb.h>
  3. #include <netinet/in.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/socket.h>
  7. #include <sys/types.h>
  8. #include <sys/time.h>
  9. #include <unistd.h>
  10. #define MAX 80
  11. #define PORT 8080
  12. #define SA struct sockaddr
  13. struct timeval timeout;
  14. void func(int connfd)
  15. {
  16.     char buff[MAX];
  17.     int f, c, ack, next = 0;
  18.     while (1)
  19.     {
  20.         sleep(1);
  21.         bzero(buff, MAX);
  22.         recv(connfd, buff, MAX, 0);
  23.         if (strcmp("Exit", buff) == 0)
  24.         {
  25.             printf("Exit\n");
  26.             break;
  27.         }
  28.         f = atoi(buff);
  29.         c = rand() % 3;
  30.         switch (c)
  31.         {
  32.         case 0:
  33.             printf("Frame %d not received\n", f);
  34.             ack = -1;
  35.             printf("Negative Acknowledgement sent: %d\n", f);
  36.             bzero(buff, MAX);
  37.             snprintf(buff, sizeof(buff), "%d", ack);
  38.             send(connfd, buff, sizeof(buff), 0);
  39.             break;
  40.         case 1:
  41.             ack = f;
  42.             sleep(2);
  43.             printf("Frame %d received\nAcknowledgement sent: %d\n", f, ack);
  44.             bzero(buff, MAX);
  45.             snprintf(buff, sizeof(buff), "%d", ack);
  46.             send(connfd, buff, sizeof(buff), 0);
  47.             next = ack + 1;
  48.             break;
  49.         case 2:
  50.             ack = f;
  51.             printf("Frame %d received\nAcknowledgement sent: %d\n", f, ack);
  52.             bzero(buff, MAX);
  53.             snprintf(buff, sizeof(buff), "%d", ack);
  54.             send(connfd, buff, sizeof(buff), 0);
  55.             next = ack + 1;
  56.             break;
  57.         }
  58.     }
  59. }
  60. void main()
  61. {
  62.     int sockfd, connfd, len;
  63.     struct sockaddr_in servaddr, cli;
  64.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  65.     if (sockfd == -1)
  66.     {
  67.         printf("Socket creation failed\n");
  68.         exit(0);
  69.     }
  70.     else
  71.         printf("Socket successfully created\n");
  72.     bzero(&servaddr, sizeof(servaddr));
  73.     servaddr.sin_family = AF_INET;
  74.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  75.     servaddr.sin_port = htons(PORT);
  76.     if ((bind(sockfd, (SA *)&servaddr, sizeof(servaddr))) != 0)
  77.     {
  78.         printf("socket bind failed\n");
  79.         exit(0);
  80.     }
  81.     else
  82.         printf("Socket successfully binded\n");
  83.     if ((listen(sockfd, 5)) != 0)
  84.     {
  85.         printf("Listen failed\n");
  86.         exit(0);
  87.     }
  88.     else
  89.         printf("Server listening\n");
  90.     len = sizeof(cli);
  91.     connfd = accept(sockfd, (SA *)&cli, &len);
  92.     if (connfd < 0)
  93.     {
  94.         printf("Server accept failed\n");
  95.         exit(0);
  96.     }
  97.     else
  98.         printf("Server accept the client\n");
  99.     func(connfd);
  100.     close(sockfd);
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement