Advertisement
Guest User

Untitled

a guest
May 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.71 KB | None | 0 0
  1. #include "fonctions_socket.h"
  2.  
  3. char ack[4]="ACK\0";
  4. char syn_ack[8]="SYN-ACK\0";
  5. char fin[4]="FIN\0";
  6. char syn[4]="SYN\0";
  7.  
  8. int puissance(int x, int n){
  9.   if(n==0){
  10.     return 1;
  11.   }
  12.   else{
  13.     return x*puissance(x,n-1);
  14.   }
  15. }
  16.  
  17. double val_absolue(double a){
  18.   if(a<0){
  19.     return (a*(-1));
  20.   }
  21.   else {
  22.     return a;
  23.   }
  24. }
  25.  
  26. double SRTT(double RTT,double SRTT){
  27.   return (0.9*SRTT+0.1*RTT);
  28. }
  29.  
  30. double RTTVAR(double SRTT, double RTT, double RTTVAR){
  31.   return ((1-(1/4))*RTTVAR+(1/4)*val_absolue(SRTT-RTT));
  32. }
  33.  
  34.  
  35. double max_element(double var1,double var2){
  36.   if (var1>var2){
  37.     return var1;
  38.   } else {
  39.     return var2;
  40.   }
  41. }
  42.  
  43.  
  44. int digit_to_int(char d)
  45. {
  46.  char str[2];
  47.  
  48.  str[0] = d;
  49.  str[1] = '\0';
  50.  return (int) strtol(str, NULL, 10);
  51. }
  52.  
  53. int isIn(int tab[], int val, int size){ //return index of value et -1 if not
  54.   int i;
  55.   for(i=0;i<size;i++)
  56.   {
  57.     if(tab[i]==val)
  58.     {
  59.       return i;
  60.     }
  61.   }
  62.   return -1;
  63. }
  64.  
  65. int ackGood(int tab[],int size){ //return index of ack missing and -1 if good
  66.   int i;
  67.   for(i=0;i<size;i++)
  68.   {
  69.     if(tab[i]>0)
  70.     {
  71.       return i;
  72.     }
  73.   }
  74.   return -1;
  75. }
  76.  
  77. int main(int argc, char const *argv[])
  78. {
  79.   char connect[1024];
  80.   int port=1025;
  81.   int socket = createSocketUDP();
  82.   struct sockaddr_in addr = setIP("0.0.0.0", strtol(argv[1],NULL,10));
  83.   int taille = sizeof(addr);
  84.   reuseSocket(socket);
  85.   bind(socket, (struct sockaddr*)&addr, sizeof(struct sockaddr));
  86.   /*
  87.             MODE CONNECTE
  88.   */
  89.   while(1)
  90.   {
  91.     port++;
  92.     int r = recvfrom(socket, &connect, sizeof(connect), 0, (struct sockaddr*)&addr, &taille);
  93.     printf("MESSAGE %d octets = %s\n", r, connect);
  94.     int sockFils = createSocketUDP();
  95.     int portFils;
  96.     struct sockaddr_in fils;
  97.  
  98.     fils = setIP("0.0.0.0", port);
  99.     bind(sockFils, (struct sockaddr*)&fils, sizeof(struct sockaddr));
  100.  
  101.     getsockname(sockFils, (struct sockaddr *)&fils, &taille);
  102.     portFils = ntohs(fils.sin_port);
  103.  
  104.  
  105.     printf("Port =  %d\n", ntohs(fils.sin_port));
  106.     printf("message=%s\n",connect);
  107.     if (strcmp(connect,syn) == 0)
  108.     {
  109.       char connect[MAX_LENGTH] = "SYN-ACK";
  110.       char port[10];
  111.       sprintf(port, "%d", portFils);
  112.       strcat(connect, port);
  113.       int s = sendto(socket, &connect, strlen(connect)+1, 0, (struct sockaddr*)&addr, taille);
  114.       if (s >= 0)
  115.       {
  116.         printf("Message envoyé %d octets !\n", s);
  117.       }
  118.       else
  119.       {
  120.           printf("Message non envoyé !\n");
  121.       }
  122.     }
  123.     r = recvfrom(socket, &connect, sizeof(connect), 0, (struct sockaddr*)&addr, &taille);
  124.     printf("MESSAGE %d octets = %s\n", r, connect);
  125.  
  126.     if (strcmp(connect,"ACK") == 0)
  127.     {
  128.       printf("ACK connexion réussie !\n");
  129.     }
  130.  
  131.     int pid = fork();
  132.     if(pid == 0)
  133.     {
  134.       //CODE DU FILS
  135.       clock_t start;
  136.       clock_t end;
  137.       double rtt=200;
  138.       double srtt=200;
  139.       double rttvar=rtt/2;
  140.  
  141.       double rto=rtt+max_element(4*rttvar,1);
  142.  
  143.       struct timeval timeout;
  144.       timeout.tv_sec=0;
  145.       //timeout.tv_usec=200;
  146.       char msg[MAX_LENGTH];
  147.       char pathFile[FILE_SIZE];
  148.       char numSeq[6];
  149.  
  150.       int i;
  151.       for(i=0;i<5;i++){
  152.         numSeq[i]='0';
  153.       }
  154.       numSeq[5]='1';
  155.       char buffer[1024];
  156.       int sequence=1;
  157.       int cwd = 10;
  158.       int nbelem;
  159.  
  160.       int size_paquet = 1024;
  161.  
  162.       r = recvfrom(sockFils, &connect, sizeof(connect), 0, (struct sockaddr*)&addr, &taille);
  163.  
  164.       memset(pathFile,0,sizeof(pathFile));
  165.       strcat(pathFile,"./");
  166.       strcat(pathFile,connect);
  167.  
  168.       FILE* file = fopen(pathFile, "rb");
  169.       fseek(file, 0, SEEK_END);
  170.       int size_file = ftell(file);
  171.       fseek(file, 0, SEEK_SET);
  172.       rewind(file);
  173.  
  174.  
  175.       if(file == NULL)
  176.       {
  177.         printf("ERREUR OUVERTURE FICHIER !\n");
  178.         exit(-1);
  179.       }
  180.  
  181.       int c, d, out;
  182.       int seq[cwd];
  183.       int verif[cwd];
  184.       int ack[cwd];
  185.       int indice, indice1, indice2, indice3, indice4;
  186.       int nbpaquet = size_file/1024;
  187.       fd_set ecouteur;
  188.       int res_select;
  189.       int acquittement;
  190.  
  191.       printf("\n~~~~~~~~~~~~~~ ENVOI ~~~~~~~~~~~~\n");
  192.       cwd = 3;
  193.       while(sequence <= nbpaquet)
  194.       {
  195.         printf("SEQUENCE : %d\n\n", sequence);
  196.         for(c = 0; c < cwd; c++)
  197.         {
  198.           seq[c] = sequence + c;
  199.           verif[c] = 1;
  200.  
  201.           memset(numSeq, 0, sizeof(numSeq));
  202.           sprintf(numSeq,"%d",seq[c]);
  203.           int strlenSeq=strlen(numSeq);
  204.           int i;
  205.           memset(numSeq, 0, sizeof(numSeq));
  206.           for(i=0;i<(6-strlenSeq);i++){
  207.             numSeq[i]='0';
  208.           }
  209.           char newSeq[strlenSeq];
  210.           sprintf(newSeq,"%d",seq[c]);
  211.           strcat(numSeq,newSeq);
  212.  
  213.           memset(msg, 0, sizeof(msg));
  214.           memset(buffer,0,sizeof(buffer));
  215.           memcpy(&msg,&numSeq,sizeof(numSeq));
  216.  
  217.  
  218.           nbelem = fread(buffer, 1024, 1, file);
  219.           if(nbelem==1)
  220.           {
  221.             size_paquet=1024;
  222.           }
  223.           else
  224.           {
  225.             size_paquet=size_file%1024;
  226.             //cwd = c;
  227.           }
  228.           printf("size_paquet = %d\n", size_paquet);
  229.  
  230.           memcpy(&msg[6],&buffer,size_paquet);
  231.           //start=clock();
  232.           int s = sendto(sockFils, &(msg), (size_paquet+6), 0, (struct sockaddr*)&addr, taille);
  233.           printf("MESSAGE ENVOYE ! Sequence = %d\n", seq[c]);
  234.         }
  235.  
  236.         d = 1;
  237.         out = 0;
  238.         while((d <= cwd) && (out == 0))
  239.         {
  240.           printf("d vaut %d\n", d);
  241.           timeout.tv_usec=1000000;
  242.           FD_ZERO(&ecouteur);
  243.           FD_SET(sockFils,&ecouteur);
  244.           res_select=select((sockFils+1),&ecouteur,NULL,NULL, &timeout);
  245.  
  246.  
  247.           if(!res_select)
  248.           {
  249.             indice1 = ackGood(verif, cwd);
  250.             if(indice1 >= 0)
  251.             {
  252.               fseek(file,-(size_paquet*(cwd-indice1)),SEEK_CUR);
  253.               printf("Time out\n");
  254.               sequence = seq[indice1];
  255.               printf("New seq time out = %d\n", sequence);
  256.               out = 1;
  257.             }
  258.             else
  259.             {
  260.               out = 0;
  261.               sequence = seq[cwd-1]+1;
  262.             }
  263.           }
  264.           else
  265.           {
  266.             r = recvfrom(sockFils, &msg, sizeof(msg), 0, (struct sockaddr*)&addr, &taille);
  267.             //end=clock();
  268.             /*rtt=(double)(end-start)/(CLOCKS_PER_SEC);
  269.             rtt=rtt*1000000;
  270.             srtt=SRTT(rtt,srtt);
  271.             rttvar=RTTVAR(srtt,rtt,rttvar);
  272.             rto=srtt+max_element(1,4*rttvar);*/
  273.  
  274.             acquittement=0;
  275.             for(i=3;i<9;i++){
  276.               acquittement=acquittement + puissance(10,i-3)*digit_to_int(msg[8+3-i]);
  277.             }
  278.             ack[d] = acquittement;
  279.             if (acquittement == seq[cwd-1])
  280.             {
  281.               sequence = seq[cwd-1]+1;
  282.               for(i=0; i<cwd; i++)
  283.               {
  284.                 verif[i] = 0;
  285.               }
  286.               d = cwd;
  287.               out = 1;
  288.             }
  289.             printf("ACK n° %d reçu ! \n", acquittement);
  290.             indice2 = isIn(seq,acquittement,cwd);
  291.             if(indice2 >= 0 && acquittement != seq[cwd-1])
  292.             {
  293.               for(i=0; i<=indice2; i++)
  294.               {
  295.                 verif[i] = 0;
  296.               }
  297.               d++;
  298.               printf("INDICE isIN ACK = %d\n", indice2);
  299.             }
  300.             else
  301.             {
  302.               indice3 = ackGood(verif, cwd);
  303.               if(indice3 >=0)
  304.               {
  305.                 fseek(file,-(size_paquet*(cwd-indice3)),SEEK_CUR);
  306.                 sequence = seq[indice3];
  307.                 printf("INDICE = %d\n", indice3);
  308.                 printf("Revenons à la sequence n° %d\n", sequence);
  309.                 out = 1;
  310.               }
  311.               else
  312.               {
  313.                 sequence = seq[cwd-1]+1;
  314.                 printf("Nouvelle sequence = %d (sortie de boucle)\n", sequence);
  315.               }
  316.             }
  317.           }
  318.         }
  319.         if(out == 0)
  320.         {
  321.           indice4 = ackGood(verif, cwd);
  322.           if(indice4 >= 0)
  323.           {
  324.             fseek(file,-(size_paquet*(cwd-indice4)),SEEK_CUR);
  325.             sequence = seq[indice4];
  326.             printf("INDICE = %d\n", indice4);
  327.             printf("Revenons à la sequence n° %d (sortie de boucle)\n", sequence);
  328.           }
  329.           else
  330.           {
  331.             sequence = seq[cwd-1]+1;
  332.             printf("Nouvelle sequence = %d (sortie de boucle)\n", sequence);
  333.           }
  334.         }
  335.       }
  336.       printf("Envoi de fin !\n");
  337.       int k;
  338.       for(k=0;k<100000;k++)
  339.       {
  340.         int s = sendto(socket, &fin, strlen(fin)+1, 0, (struct sockaddr*)&addr, taille);
  341.       }
  342.       fclose(file);
  343.       exit(0);
  344.     }
  345.   }
  346.   return 0;
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement