Blame view

Threads/threadSocket.c 4.6 KB
a69a94a7   skhinach   Ajout de gestion ...
1
2
3
4
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <arpa/inet.h>
  #include <netdb.h>
32c9271a   skhinach   modif
5
6
7
8
9
  #include <stdio.h>
  #include <stdlib.h>
  #include <pthread.h>
  #include <string.h>
  #include <unistd.h>
a69a94a7   skhinach   Ajout de gestion ...
10
11
12
13
  #include <time.h>
  #include "http.h"
  #include "libnet.h"
  #include "libthrd.h"
32c9271a   skhinach   modif
14
  
32c9271a   skhinach   modif
15
  
1a2c5f60   skhinach   Quelques modifs f...
16
  void vider_interfaces(Arg_Thread* argument)
3e25c332   pifou   Big upload
17
  {
1a2c5f60   skhinach   Quelques modifs f...
18
19
  	pthread_mutex_lock(&(argument->requete_mutex)); // Section critique
  
a69a94a7   skhinach   Ajout de gestion ...
20
21
  	for(int i=0; i<20; i++)
  	{
1a2c5f60   skhinach   Quelques modifs f...
22
  		if(argument->interfaces[i]!=NULL)
a69a94a7   skhinach   Ajout de gestion ...
23
  		{
1a2c5f60   skhinach   Quelques modifs f...
24
25
  			free(argument->interfaces[i]);
  			argument->interfaces[i]=NULL;
a69a94a7   skhinach   Ajout de gestion ...
26
27
  		}
  	}
1a2c5f60   skhinach   Quelques modifs f...
28
  	pthread_mutex_unlock(&(argument->requete_mutex)); // Libération de la section critique
a69a94a7   skhinach   Ajout de gestion ...
29
  }
08f8ef8d   skhinach   modifs
30
31
  
  
1a2c5f60   skhinach   Quelques modifs f...
32
  int httpReponse(FILE* sockdial_stream, Arg_Thread* argument)
a69a94a7   skhinach   Ajout de gestion ...
33
34
  {	
  	char message[]={0x00,0x00};
8450f712   Antoine Moreau   fin
35
  	char message2[]={0x60,0x00};
08f8ef8d   skhinach   modifs
36
  
a69a94a7   skhinach   Ajout de gestion ...
37
  	sendUDPBroadcast(message, 2020);
8450f712   Antoine Moreau   fin
38
  	sendUDPBroadcast(message2, 2020);
a69a94a7   skhinach   Ajout de gestion ...
39
  	struct PageWeb* page; 
fff6f037   skhinach   modifs
40
  
8450f712   Antoine Moreau   fin
41
  	sleep(2); // Temps d'attente avant de recevoir les informations
1a2c5f60   skhinach   Quelques modifs f...
42
43
44
45
46
  	pthread_mutex_lock(&(argument->requete_mutex)); // Section critique
  
  	createPage(&page, argument->interfaces); // Permet de creer la pageweb (http.c)
  	
  	pthread_mutex_unlock(&(argument->requete_mutex)); // Libération de la section critique
08f8ef8d   skhinach   modifs
47
  
a69a94a7   skhinach   Ajout de gestion ...
48
  	char buffer[BUFF_SIZE];	// Le buffer de message pour l'emission
08f8ef8d   skhinach   modifs
49
  
a69a94a7   skhinach   Ajout de gestion ...
50
  	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
08f8ef8d   skhinach   modifs
51
  
a69a94a7   skhinach   Ajout de gestion ...
52
  	fprintf(sockdial_stream, "%s", buffer);
08f8ef8d   skhinach   modifs
53
  
a69a94a7   skhinach   Ajout de gestion ...
54
  	strcpy(buffer, page->html_contents);
08f8ef8d   skhinach   modifs
55
  
a69a94a7   skhinach   Ajout de gestion ...
56
  	fprintf(sockdial_stream, "%s", buffer);
08f8ef8d   skhinach   modifs
57
  
a69a94a7   skhinach   Ajout de gestion ...
58
  	freePage(&page);
08f8ef8d   skhinach   modifs
59
  
a69a94a7   skhinach   Ajout de gestion ...
60
61
  	return 0;
  }
08f8ef8d   skhinach   modifs
62
  
8450f712   Antoine Moreau   fin
63
  int interfaceReponse(char packet[BUFF_SIZE], Arg_Thread* argument, char adresse[20])
3e25c332   pifou   Big upload
64
  {
a69a94a7   skhinach   Ajout de gestion ...
65
  
1a2c5f60   skhinach   Quelques modifs f...
66
67
68
69
  	// On lock le mutex car on rentre dans la section critique (modification de la structure interfaces)
  
  	pthread_mutex_lock(&(argument->requete_mutex));
  
a69a94a7   skhinach   Ajout de gestion ...
70
  	int i=0;
8450f712   Antoine Moreau   fin
71
  	while(i<=19 && argument->interfaces[i]!=NULL && strcmp(adresse, argument->interfaces[i]->adresse)!=0)
08f8ef8d   skhinach   modifs
72
  	{
a69a94a7   skhinach   Ajout de gestion ...
73
  		i++;	
08f8ef8d   skhinach   modifs
74
  	}
32c9271a   skhinach   modif
75
  	
8450f712   Antoine Moreau   fin
76
77
78
79
  	/* if(argument->interfaces[0]!=NULL) */
  	/* 	printf("Il y a %d associations\n", i+1); */
  	/* else */
  	/* 	printf("Il n'y aucune association\n"); */
32c9271a   skhinach   modif
80
  
5940bf6e   skhinach   Quelques modifs
81
  	if(packet[0]==0x20 && (packet[1]==0x01 || packet[1]==0x00) )
a69a94a7   skhinach   Ajout de gestion ...
82
  	{		
8450f712   Antoine Moreau   fin
83
  	  //L'interface a correctement répondu au broadcast de GETSTATUS
a69a94a7   skhinach   Ajout de gestion ...
84
  		printf("L'interface a correctement répondu\n");
08f8ef8d   skhinach   modifs
85
  
1a2c5f60   skhinach   Quelques modifs f...
86
  		if(argument->interfaces[i]==NULL)
a69a94a7   skhinach   Ajout de gestion ...
87
  		{
1a2c5f60   skhinach   Quelques modifs f...
88
89
  			argument->interfaces[i]=malloc(sizeof(struct interface_info));
  			strcpy(argument->interfaces[i]->adresse, adresse);
a69a94a7   skhinach   Ajout de gestion ...
90
  		}
08f8ef8d   skhinach   modifs
91
  
a69a94a7   skhinach   Ajout de gestion ...
92
  		if(packet[1]==0x01)
1a2c5f60   skhinach   Quelques modifs f...
93
  			argument->interfaces[i]->status=1;
a69a94a7   skhinach   Ajout de gestion ...
94
  		else
1a2c5f60   skhinach   Quelques modifs f...
95
  			argument->interfaces[i]->status=0;		
3e25c332   pifou   Big upload
96
  	}
8450f712   Antoine Moreau   fin
97
98
99
  
  	else if ((((unsigned char)packet[0])>>5) == 0x05)
  	  {
a629f0c7   Antoine Moreau   Fin.
100
  	    printf("L'interface a correctement répondu\n");
8450f712   Antoine Moreau   fin
101
102
103
104
105
106
107
108
109
  	    if(argument->interfaces[i]==NULL)
  		{
  			argument->interfaces[i]=malloc(sizeof(struct interface_info));
  			strcpy(argument->interfaces[i]->adresse, adresse);
  		}
  
  	    uint16_t tmp = (unsigned char)packet[0] & 0x1F; //Récupération du pourcentage
  	    tmp = tmp << 8;
  	    tmp += (unsigned char)packet[1];
a629f0c7   Antoine Moreau   Fin.
110
  	    argument->interfaces[i]->commande = (int)((tmp*100)/8192);
8450f712   Antoine Moreau   fin
111
  	  }
5940bf6e   skhinach   Quelques modifs
112
113
  	else
  	{	// L'interface n a pas correctement répondu
1a2c5f60   skhinach   Quelques modifs f...
114
115
  		
  		pthread_mutex_unlock(&(argument->requete_mutex)); // Libération de la section critique
5940bf6e   skhinach   Quelques modifs
116
  		printf("L'interface n'a pas correctement répondu\n");
a69a94a7   skhinach   Ajout de gestion ...
117
  		return -1;
5940bf6e   skhinach   Quelques modifs
118
  	}
1a2c5f60   skhinach   Quelques modifs f...
119
  	pthread_mutex_unlock(&(argument->requete_mutex)); // Libération de la section critique
a69a94a7   skhinach   Ajout de gestion ...
120
121
  	return 0;
  }
3e25c332   pifou   Big upload
122
  
3e25c332   pifou   Big upload
123
  
3e25c332   pifou   Big upload
124
  
a69a94a7   skhinach   Ajout de gestion ...
125
126
127
128
  void* reponseConnexion(void* arg_sock_interf)
  {	
  	Arg_Thread *argument=(Arg_Thread*)(arg_sock_interf);
  	int sock=argument->socket;
fff6f037   skhinach   modifs
129
  
a629f0c7   Antoine Moreau   Fin.
130
  	printf("Connecte\n"); // Affiche le fait que qqn soit connecté
3e25c332   pifou   Big upload
131
  
8450f712   Antoine Moreau   fin
132
133
134
135
136
137
  	FILE* sockdial_stream = fdopen(sock, "a+");
  	if (sockdial_stream == NULL)
  	  {
  	    fprintf(stderr,"Erreur d'ouverture sockdial_stream\n");
  	    pthread_exit(NULL);
  	  }
a69a94a7   skhinach   Ajout de gestion ...
138
  	char buff_rec[BUFF_SIZE]; // Le buffer de message à la reception
08f8ef8d   skhinach   modifs
139
  	fgets(buff_rec, BUFF_SIZE, sockdial_stream);
5940bf6e   skhinach   Quelques modifs
140
  
a69a94a7   skhinach   Ajout de gestion ...
141
142
143
  	//Distingue la requête HTTP...
  	if(strstr(buff_rec, "GET")!=NULL && strstr(buff_rec, "HTTP")!=NULL)
  	{
8450f712   Antoine Moreau   fin
144
145
  	  vider_interfaces(argument);	
  	  httpReponse(sockdial_stream, argument);
a69a94a7   skhinach   Ajout de gestion ...
146
147
148
149
150
151
152
153
  	}
  	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];
8450f712   Antoine Moreau   fin
154
155
  			sprintf(adresse, "%s", inet_ntoa(((struct sockaddr_in*)&tmp_addr)->sin_addr));			
  			interfaceReponse(buff_rec, argument, adresse);	
a69a94a7   skhinach   Ajout de gestion ...
156
157
  		}
  	}
32c9271a   skhinach   modif
158
  
a629f0c7   Antoine Moreau   Fin.
159
    	printf("Fin de la connexion\n");
a69a94a7   skhinach   Ajout de gestion ...
160
  
32c9271a   skhinach   modif
161
  	fclose(sockdial_stream);
a69a94a7   skhinach   Ajout de gestion ...
162
  
32c9271a   skhinach   modif
163
164
165
166
  	pthread_exit(NULL);
  }
  
  
08f8ef8d   skhinach   modifs
167
  
32c9271a   skhinach   modif
168
169
170
  int lanceThread(void(* fonction) (void *), void* arg, int size)
  {
  	pthread_t thr_id;
a629f0c7   Antoine Moreau   Fin.
171
  	printf("%d\n",size);	
32c9271a   skhinach   modif
172
173
174
175
176
177
  	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;
  }