Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // HPUS : Hordes PopUp Server
- #include <stdio.h> //printf
- #include <stdlib.h> //exit
- #include <sys/socket.h> //recv
- #include <unistd.h> //close
- #include <netinet/in.h> //struct sockaddr_in
- #include <signal.h> //sigaction
- #include <pthread.h> //pthread_create
- #include <string.h> //strlen
- #include <fcntl.h> //open
- #include <time.h> //time
- int sock;
- char* genererNomFichier(char* res){
- time_t timestamp = time(NULL);
- struct tm* t = localtime(×tamp);
- sprintf(res,"popup%04d%02d%02d.txt",t->tm_year+1900,t->tm_mon+1,t->tm_mday);
- return res;
- }
- char* getHeaderContent(const char* header,const char* key,char* value){
- char* res = NULL;
- int curseur = 0;
- while(header[curseur] != '\r'){ //La première ligne est la méthode et le paramètre: on les ignore
- curseur++;
- }
- curseur += 2;
- while(header[curseur] != 0 && res == NULL){
- char currentKey[32];
- int keyIndex = 0;
- while(header[curseur] != ':'){ //On prend la clé de l'en-tête
- //printf("%c\n",header[curseur]);
- currentKey[keyIndex] = header[curseur];
- keyIndex++;
- curseur++;
- }
- curseur += 2;
- currentKey[keyIndex] = 0;
- //printf("currentKey=\"%s\"\n",currentKey);
- if(!strcmp(currentKey,key)){ //Si c'est l'en-tête recherchée
- int valueIndex = 0;
- while(header[curseur] != '\r'){ //On copie le contenu de sa valeur
- value[valueIndex] = header[curseur];
- valueIndex++;
- curseur++;
- }
- res = value;
- }else{
- while(header[curseur] != '\r'){ //Sinon, on ignore la ligne
- curseur++;
- }
- curseur += 2;
- }
- }
- return res;
- }
- void* threadReception(void* arg){
- long connexion = (long)arg;
- char header[512];
- int current = 0;
- //printf("'\\r \\n' == %hhd %hhd\n",'\r','\n');
- do{
- current += recv(connexion,header+current,1,0);
- //printf("%hhd %hhd %hhd %hhd\n",header[current-4],header[current-3],header[current-2],header[current-1]);
- }while(header[current-4] != '\r' || header[current-3] != '\n' || header[current-2] != '\r' || header[current-1] != '\n');
- header[current] = 0;
- printf("%s",header);
- char strLength[8];
- getHeaderContent(header,"Content-Length",strLength);
- int length = atoi(strLength);
- //printf("Content-Length: \"%s\" %d\n",strLength,length);
- char* body = malloc((length+1)*sizeof(char));
- current = 0;
- while(current < length){
- current += recv(connexion,body+current,1,0);
- }
- printf("%.*s\n",length,body);
- char nomFichier[18];
- int file = open(genererNomFichier(nomFichier),O_CREAT | O_WRONLY | O_APPEND,S_IRWXU);
- flock(file,LOCK_EX);
- dprintf(file,"%.*s\n",length,body);
- flock(file,LOCK_UN);
- close(file);
- free(body);
- char buffer[] = "HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: *\n\n";
- //printf("%s\n",buffer);
- send(connexion,buffer,strlen(buffer),0);
- close(connexion);
- return NULL;
- }
- void arretServeur(int sig){
- printf("Arrêt du serveur\n");
- close(sock);
- exit(0);
- }
- int main(int argc,char** argv){
- int port = 80;
- struct sockaddr_in server;
- server.sin_family = AF_INET;
- server.sin_port = htons(port);
- sock = socket(AF_INET,SOCK_STREAM,0);
- if(bind(sock,(struct sockaddr*)&server,sizeof(server)) < 0){
- perror("bind");
- return 1;
- }
- listen(sock,10);
- struct sigaction arret;
- arret.sa_handler = arretServeur;
- sigaction(SIGINT,&arret,NULL);
- struct sockaddr sa;
- socklen_t size;
- printf("Serveur lancé.\n");
- while(1){
- long connexion = accept(sock,&sa,&size);
- printf("Connexion reçue\n");
- pthread_t thread;
- pthread_create(&thread,NULL,threadReception,(void*)connexion);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement