Bewin

Go-Back-N-ARQ Server

Mar 24th, 2025
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.77 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.         if (f != next)
  30.         {
  31.             printf("Frame %d discarded\nAcknowledgement sent: %d\n", f, ack);
  32.             bzero(buff, MAX);
  33.             snprintf(buff, sizeof(buff), "%d", ack);
  34.             send(connfd, buff, sizeof(buff), 0);
  35.             continue;
  36.         }
  37.         c = rand() % 3;
  38.         switch (c)
  39.         {
  40.             case 0:
  41.                 // printf("Frame %d not received\n",f);
  42.                 break;
  43.             case 1:
  44.                 ack = f;
  45.                 sleep(2);
  46.                 printf("Frame %d received\nAcknowledement sent: %d\n", f, ack);
  47.                 bzero(buff, MAX);
  48.                 snprintf(buff, sizeof(buff), "%d", ack);
  49.                 send(connfd, buff, sizeof(buff), 0);
  50.                 next = ack + 1;
  51.                 break;
  52.             case 2:
  53.                 ack = f;
  54.                 printf("Frame %d received\nAcknowledement sent: %d\n", f, ack);
  55.                 bzero(buff, MAX);
  56.                 snprintf(buff, sizeof(buff), "%d", ack);
  57.                 send(connfd, buff, sizeof(buff), 0);
  58.                 next = ack + 1;
  59.                 break;
  60.         }
  61.     }
  62. }
  63. void main()
  64. {
  65.     int sockfd, connfd, len;
  66.     struct sockaddr_in servaddr, cli;
  67.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  68.     if (sockfd == -1)
  69.     {
  70.         printf("Socket creation failed\n");
  71.         exit(0);
  72.     }
  73.     else
  74.         printf("Socket successfully created\n");
  75.     bzero(&servaddr, sizeof(servaddr));
  76.     servaddr.sin_family = AF_INET;
  77.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  78.     servaddr.sin_port = htons(PORT);
  79.     if ((bind(sockfd, (SA *)&servaddr, sizeof(servaddr))) != 0)
  80.     {
  81.         printf("socket bind failed\n");
  82.         exit(0);
  83.     }
  84.     else
  85.         printf("Socket successfully binded\n");
  86.     if ((listen(sockfd, 5)) != 0)
  87.     {
  88.         printf("Listen failed\n");
  89.         exit(0);
  90.     }
  91.     else
  92.         printf("Server listening\n");
  93.     len = sizeof(cli);
  94.     connfd = accept(sockfd, (SA *)&cli, &len);
  95.     if (connfd < 0)
  96.     {
  97.         printf("Server accept failed\n");
  98.         exit(0);
  99.     }
  100.     else
  101.         printf("Server accept the client\n");
  102.     func(connfd);
  103.     close(sockfd);
  104. }
Add Comment
Please, Sign In to add comment