#include #include #include #include #include #include #include #include #include #include #include "http.h" #include "libnet.h" #include "libthrd.h" void vider_interfaces(struct interface_info* interfaces[20]) { for(int i=0; i<20; i++) { if(interfaces[i]!=NULL) { free(interfaces[i]); interfaces[i]=NULL; } } } int httpReponse(FILE* sockdial_stream, struct interface_info* interfaces[20]) { char message[]={0x00,0x00}; sendUDPBroadcast(message, 2020); struct PageWeb* page; sleep(0.5); // Temps d'attente avant de recevoir les informations createPage(&page, interfaces); // Permet de creer la pageweb (http.c) char buffer[BUFF_SIZE]; // Le buffer de message pour l'emission // char buff_rec[BUFF_SIZE]; // Le buffer de message à la reception strcat(buffer,"HTTP/1.1 200 OK\r\nServer: Serveur Sioux\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: Keep-alive\r\n\r\n"); // Header HTTP fprintf(sockdial_stream, "%s", buffer); strcpy(buffer, page->html_contents); fprintf(sockdial_stream, "%s", buffer); freePage(&page); return 0; } int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct interface_info* interfaces[20], char adresse[20]) { printf("Interface : %s - Adresse : %s\n", packet, adresse); char buffer[BUFF_SIZE]; int i=0; while(interfaces[i]!=NULL && strcmp(adresse,interfaces[i]->adresse)!=0) { i++; } if(interfaces[0]!=NULL) printf("Il y a %d associations\n", i+1); else printf("Il n'y aucune association\n"); if(interfaces[i]!=NULL) interfaces[i]->status=-1; if(strlen(packet)>=2 && packet[0]=='A' && (packet[1]=='A' || packet[1]=='B') ) { //L'interface a correctement répondu, on la rajoute à la liste des interfaces printf("L'interface a correctement répondu\n"); if(interfaces[i]==NULL) { interfaces[i]=malloc(sizeof(struct interface_info)); strcpy(interfaces[i]->adresse, adresse); } if(packet[1]==0x01) interfaces[i]->status=1; else interfaces[i]->status=0; } else // L'interface n a pas correctement répondu return -1; strcpy(buffer, "\x60\x00"); // Demande la commande en mémoire fprintf(sockdial_stream, "%s", buffer); // Transmission du message fgets(packet, BUFF_SIZE, sockdial_stream); // Attente de reception du message if( strlen(packet)>=2 && (packet[0]&0xE0)==0x10 ) interfaces[i]->commande = (packet[0]&0x01)*256+packet[1]; else { interfaces[i]->commande = -1; return -1; // Si le message n'est pas reçu correctement } return 0; } void* reponseConnexion(void* arg_sock_interf) { Arg_Thread *argument=(Arg_Thread*)(arg_sock_interf); int sock=argument->socket; printf("Connected\n"); // Affiche le fait que qqn soit connecté FILE* sockdial_stream = fdopen(sock, "a+"); char buff_rec[BUFF_SIZE]; // Le buffer de message à la reception // char buffer[BUFF_SIZE]; // Le buffer de message pour l'emission fgets(buff_rec, BUFF_SIZE, sockdial_stream); printf("Le message reçu : %s\n", buff_rec); //Distingue la requête HTTP... if(strstr(buff_rec, "GET")!=NULL && strstr(buff_rec, "HTTP")!=NULL) { vider_interfaces(argument->interfaces); httpReponse(sockdial_stream, argument->interfaces); } else //.. d'une requête interface { struct sockaddr_storage tmp_addr; socklen_t addr_len=sizeof(tmp_addr); if(getpeername(sock, (struct sockaddr*)&tmp_addr, &addr_len)==0) { char adresse[20]; sprintf(adresse, "%s", inet_ntoa(((struct sockaddr_in*)&tmp_addr)->sin_addr)); interfaceReponse(sockdial_stream, buff_rec, argument->interfaces, adresse); } } printf("Sock : %d // Stream : %p \n", sock, sockdial_stream); printf("Fin de la connexion\n"); fclose(sockdial_stream); pthread_exit(NULL); } int lanceThread(void(* fonction) (void *), void* arg, int size) { pthread_t thr_id; printf("%d \n",size); if(pthread_create(&thr_id, NULL, (void*)fonction, arg )!=0) { fprintf(stderr, "Le thread n'a pas pu être créé.\n"); return -1; } pthread_detach(thr_id); return 0; }