Advertisement
Guest User

SERVEUR

a guest
May 20th, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.74 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 = 2;
  158.  
  159.       int size_paquet = 1024;
  160.  
  161.       r = recvfrom(sockFils, &connect, sizeof(connect), 0, (struct sockaddr*)&addr, &taille);
  162.  
  163.       memset(pathFile,0,sizeof(pathFile));
  164.       strcat(pathFile,"./");
  165.       strcat(pathFile,connect);
  166.  
  167.       FILE* file = fopen(pathFile, "rb");
  168.       fseek(file, 0, SEEK_END);
  169.       int size_file = ftell(file);
  170.       fseek(file, 0, SEEK_SET);
  171.       rewind(file);
  172.  
  173.  
  174.       if(file == NULL)
  175.       {
  176.         printf("ERREUR OUVERTURE FICHIER !\n");
  177.         exit(-1);
  178.       }
  179.  
  180.       int c;
  181.       int seq[cwd];
  182.       int verif[cwd];
  183.       int indice;
  184.       int nbpaquet = size_file/1024;
  185.       fd_set ecouteur;
  186.       int res_select;
  187.  
  188.       printf("\n~~~~~~~~~~~~~~ ENVOI ~~~~~~~~~~~~\n");
  189.       while(sequence <= nbpaquet)
  190.       {
  191.         printf("SEQUENCE : %d\n\n", sequence);
  192.         for(c = 0; c < cwd; c++)
  193.         {
  194.           seq[c] = sequence + c;
  195.           verif[c] = 1;
  196.  
  197.           memset(numSeq, 0, sizeof(numSeq));
  198.           sprintf(numSeq,"%d",sequence);
  199.           int strlenSeq=strlen(numSeq);
  200.           int i;
  201.           memset(numSeq, 0, sizeof(numSeq));
  202.           for(i=0;i<(6-strlenSeq);i++){
  203.             numSeq[i]='0';
  204.           }
  205.           char newSeq[strlenSeq];
  206.           sprintf(newSeq,"%d",seq[c]);
  207.           strcat(numSeq,newSeq);
  208.  
  209.           memset(msg, 0, sizeof(msg));
  210.           memset(buffer,0,sizeof(buffer));
  211.           memcpy(&msg,&numSeq,sizeof(numSeq));
  212.  
  213.  
  214.           int nbelem = fread(buffer, 1024, 1, file);
  215.           if(nbelem==1)
  216.           {
  217.             size_paquet=1024;
  218.           }
  219.           else
  220.           {
  221.             size_paquet=size_file%1024;
  222.           }
  223.  
  224.           memcpy(&msg[6],&buffer,size_paquet);
  225.           //start=clock();
  226.           int s = sendto(sockFils, &(msg), (size_paquet+6), 0, (struct sockaddr*)&addr, taille);
  227.           printf("MESSAGE ENVOYE ! Sequence = %d\n", seq[c]);
  228.         }
  229.  
  230.         int d = 1;
  231.         int out = 0;
  232.         while((d <= cwd) && (out == 0))
  233.         {
  234.           printf("d vaut %d\n", d);
  235.           timeout.tv_usec=1000000;
  236.           FD_ZERO(&ecouteur);
  237.           FD_SET(sockFils,&ecouteur);
  238.           res_select=select((sockFils+1),&ecouteur,NULL,NULL, &timeout);
  239.  
  240.  
  241.           if(!res_select)
  242.           {
  243.             indice = ackGood(verif, cwd);
  244.             fseek(file,-(size_paquet*(cwd-indice)),SEEK_CUR);
  245.             printf("Time out\n");
  246.             out = 1;
  247.           }
  248.           else
  249.           {
  250.             r = recvfrom(sockFils, &msg, sizeof(msg), 0, (struct sockaddr*)&addr, &taille);
  251.             //end=clock();
  252.             /*rtt=(double)(end-start)/(CLOCKS_PER_SEC);
  253.             rtt=rtt*1000000;
  254.             srtt=SRTT(rtt,srtt);
  255.             rttvar=RTTVAR(srtt,rtt,rttvar);
  256.             rto=srtt+max_element(1,4*rttvar);*/
  257.  
  258.             int acquittement=0;
  259.             int i;
  260.             for(i=3;i<9;i++){
  261.               acquittement=acquittement + puissance(10,i-3)*digit_to_int(msg[8+3-i]);
  262.             }
  263.             printf("ACK n° %d reçu ! \n", acquittement);
  264.             indice = isIn(seq,acquittement,cwd);
  265.             if(indice >= 0)
  266.             {
  267.               verif[indice] == 0;
  268.               d++;
  269.               //sequence = seq[cwd-1]+1;
  270.               printf("INDICE isIN ACK = %d\n", indice);
  271.             }
  272.             else
  273.             {
  274.               /*indice = ackGood(verif, cwd);
  275.               fseek(file,-(size_paquet*(cwd-indice)),SEEK_CUR);
  276.               out = 1;
  277.               sequence = seq[indice];
  278.               printf("INDICE = %d\n", indice);
  279.               printf("Revenons à la sequence n° %d\n", sequence);
  280.               out =1;*/
  281.               out = 1;
  282.             }
  283.           }
  284.         }
  285.  
  286.         indice = ackGood(verif, cwd);
  287.         if(indice >= 0)
  288.         {
  289.           fseek(file,-(size_paquet*(cwd-indice)),SEEK_CUR);
  290.           sequence = seq[indice];
  291.           printf("INDICE = %d\n", indice);
  292.           printf("Revenons à la sequence n° %d (sortie de boucle)\n", sequence);
  293.         }
  294.         else
  295.         {
  296.           sequence = seq[cwd-1]+1;
  297.           printf("Nouvelle sequence = %d (sortie de boucle)\n", sequence);
  298.         }
  299.       }
  300.       printf("c'est la fin\n");
  301.       int k;
  302.       for(k=0;k<100000;k++){
  303.         int s = sendto(socket, &fin, strlen(fin)+1, 0, (struct sockaddr*)&addr, taille);
  304.         if(s>0)
  305.         {
  306.           printf("Message envoyé %d octets %s fff\n", s, fin);
  307.         }
  308.       }
  309.       fclose(file);
  310.       exit(0);
  311.     }
  312.   }
  313.   return 0;
  314. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement