threadSocket.c 4.06 KB
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#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;
}