Advertisement
LcsTen

HPUS

Jan 18th, 2020
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.50 KB | None | 0 0
  1. // HPUS : Hordes PopUp Server
  2.  
  3. #include <stdio.h> //printf
  4. #include <stdlib.h> //exit
  5. #include <sys/socket.h> //recv
  6. #include <unistd.h> //close
  7. #include <netinet/in.h> //struct sockaddr_in
  8. #include <signal.h> //sigaction
  9. #include <pthread.h> //pthread_create
  10. #include <string.h> //strlen
  11. #include <fcntl.h> //open
  12. #include <time.h> //time
  13.  
  14. int sock;
  15.  
  16. char* genererNomFichier(char* res){
  17.     time_t timestamp = time(NULL);
  18.     struct tm* t = localtime(&timestamp);
  19.     sprintf(res,"popup%04d%02d%02d.txt",t->tm_year+1900,t->tm_mon+1,t->tm_mday);
  20.     return res;
  21. }
  22.  
  23. char* getHeaderContent(const char* header,const char* key,char* value){
  24.     char* res = NULL;
  25.     int curseur = 0;
  26.     while(header[curseur] != '\r'){ //La première ligne est la méthode et le paramètre: on les ignore
  27.         curseur++;
  28.     }
  29.     curseur += 2;
  30.     while(header[curseur] != 0 && res == NULL){
  31.         char currentKey[32];
  32.         int keyIndex = 0;
  33.         while(header[curseur] != ':'){ //On prend la clé de l'en-tête
  34.             //printf("%c\n",header[curseur]);
  35.             currentKey[keyIndex] = header[curseur];
  36.             keyIndex++;
  37.             curseur++;
  38.         }
  39.         curseur += 2;
  40.         currentKey[keyIndex] = 0;
  41.         //printf("currentKey=\"%s\"\n",currentKey);
  42.         if(!strcmp(currentKey,key)){ //Si c'est l'en-tête recherchée
  43.             int valueIndex = 0;
  44.             while(header[curseur] != '\r'){ //On copie le contenu de sa valeur
  45.                 value[valueIndex] = header[curseur];
  46.                 valueIndex++;
  47.                 curseur++;
  48.             }
  49.             res = value;
  50.         }else{
  51.             while(header[curseur] != '\r'){ //Sinon, on ignore la ligne
  52.                 curseur++;
  53.             }
  54.             curseur += 2;
  55.         }
  56.     }
  57.     return res;
  58. }
  59.  
  60. void* threadReception(void* arg){
  61.     long connexion = (long)arg;
  62.     char header[512];
  63.     int current = 0;
  64.     //printf("'\\r \\n' == %hhd %hhd\n",'\r','\n');
  65.     do{
  66.         current += recv(connexion,header+current,1,0);
  67.         //printf("%hhd %hhd %hhd %hhd\n",header[current-4],header[current-3],header[current-2],header[current-1]);
  68.     }while(header[current-4] != '\r' || header[current-3] != '\n' || header[current-2] != '\r' || header[current-1] != '\n');
  69.     header[current] = 0;
  70.     printf("%s",header);
  71.     char strLength[8];
  72.     getHeaderContent(header,"Content-Length",strLength);
  73.     int length = atoi(strLength);
  74.     //printf("Content-Length: \"%s\" %d\n",strLength,length);
  75.     char* body = malloc((length+1)*sizeof(char));
  76.     current = 0;
  77.     while(current < length){
  78.         current += recv(connexion,body+current,1,0);
  79.     }
  80.     printf("%.*s\n",length,body);
  81.     char nomFichier[18];
  82.     int file = open(genererNomFichier(nomFichier),O_CREAT | O_WRONLY | O_APPEND,S_IRWXU);
  83.     flock(file,LOCK_EX);
  84.     dprintf(file,"%.*s\n",length,body);
  85.     flock(file,LOCK_UN);
  86.     close(file);
  87.     free(body);
  88.     char buffer[] = "HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: *\n\n";
  89.     //printf("%s\n",buffer);
  90.     send(connexion,buffer,strlen(buffer),0);
  91.     close(connexion);
  92.     return NULL;
  93. }
  94.  
  95. void arretServeur(int sig){
  96.     printf("Arrêt du serveur\n");
  97.     close(sock);
  98.     exit(0);
  99. }
  100.  
  101. int main(int argc,char** argv){
  102.     int port = 80;
  103.     struct sockaddr_in server;
  104.     server.sin_family = AF_INET;
  105.     server.sin_port = htons(port);
  106.     sock = socket(AF_INET,SOCK_STREAM,0);
  107.     if(bind(sock,(struct sockaddr*)&server,sizeof(server)) < 0){
  108.         perror("bind");
  109.         return 1;
  110.     }
  111.     listen(sock,10);
  112.    
  113.     struct sigaction arret;
  114.     arret.sa_handler = arretServeur;
  115.     sigaction(SIGINT,&arret,NULL);
  116.    
  117.     struct sockaddr sa;
  118.     socklen_t size;
  119.     printf("Serveur lancé.\n");
  120.     while(1){
  121.         long connexion = accept(sock,&sa,&size);
  122.         printf("Connexion reçue\n");
  123.         pthread_t thread;
  124.         pthread_create(&thread,NULL,threadReception,(void*)connexion);
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement