Blame view

Threads/threadSocket.c 5.02 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
29
30
  
  	pthread_mutex_unlock(&(argument->requete_mutex)); // Libération de la section critique
  
a69a94a7   skhinach   Ajout de gestion ...
31
  }
08f8ef8d   skhinach   modifs
32
33
  
  
1a2c5f60   skhinach   Quelques modifs f...
34
  int httpReponse(FILE* sockdial_stream, Arg_Thread* argument)
a69a94a7   skhinach   Ajout de gestion ...
35
36
  {	
  	char message[]={0x00,0x00};
08f8ef8d   skhinach   modifs
37
  
a69a94a7   skhinach   Ajout de gestion ...
38
  	sendUDPBroadcast(message, 2020);
fff6f037   skhinach   modifs
39
  
a69a94a7   skhinach   Ajout de gestion ...
40
  	struct PageWeb* page; 
fff6f037   skhinach   modifs
41
  
0f1eb4c5   skhinach   test
42
  	sleep(1); // Temps d'attente avant de recevoir les informations
32c9271a   skhinach   modif
43
  
1a2c5f60   skhinach   Quelques modifs f...
44
45
46
47
48
  	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
49
  
a69a94a7   skhinach   Ajout de gestion ...
50
51
  	char buffer[BUFF_SIZE];	// Le buffer de message pour l'emission
  	// char buff_rec[BUFF_SIZE]; // Le buffer de message à la reception
08f8ef8d   skhinach   modifs
52
  
a69a94a7   skhinach   Ajout de gestion ...
53
  	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
54
  
a69a94a7   skhinach   Ajout de gestion ...
55
  	fprintf(sockdial_stream, "%s", buffer);
08f8ef8d   skhinach   modifs
56
  
a69a94a7   skhinach   Ajout de gestion ...
57
  	strcpy(buffer, page->html_contents);
08f8ef8d   skhinach   modifs
58
  
a69a94a7   skhinach   Ajout de gestion ...
59
  	fprintf(sockdial_stream, "%s", buffer);
08f8ef8d   skhinach   modifs
60
  
a69a94a7   skhinach   Ajout de gestion ...
61
  	freePage(&page);
08f8ef8d   skhinach   modifs
62
  
a69a94a7   skhinach   Ajout de gestion ...
63
64
  	return 0;
  }
08f8ef8d   skhinach   modifs
65
  
08f8ef8d   skhinach   modifs
66
  
3e25c332   pifou   Big upload
67
  
a69a94a7   skhinach   Ajout de gestion ...
68
  
1a2c5f60   skhinach   Quelques modifs f...
69
  int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], Arg_Thread* argument, char adresse[20])
3e25c332   pifou   Big upload
70
  {
5940bf6e   skhinach   Quelques modifs
71
  	printf("Interface : %x %x - Adresse : %s - Taille : %ld\n", packet[0], packet[1], adresse, strlen(packet));
a69a94a7   skhinach   Ajout de gestion ...
72
73
74
  	
  	char buffer[BUFF_SIZE];	
  
1a2c5f60   skhinach   Quelques modifs f...
75
76
77
78
  	// 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 ...
79
  	int i=0;
1a2c5f60   skhinach   Quelques modifs f...
80
  	while(argument->interfaces[i]!=NULL && strcmp(adresse, argument->interfaces[i]->adresse)!=0)
08f8ef8d   skhinach   modifs
81
  	{
a69a94a7   skhinach   Ajout de gestion ...
82
  		i++;	
08f8ef8d   skhinach   modifs
83
  	}
32c9271a   skhinach   modif
84
  	
1a2c5f60   skhinach   Quelques modifs f...
85
  	if(argument->interfaces[0]!=NULL)
a69a94a7   skhinach   Ajout de gestion ...
86
  		printf("Il y a %d associations\n", i+1);
3e25c332   pifou   Big upload
87
  	else
a69a94a7   skhinach   Ajout de gestion ...
88
  		printf("Il n'y aucune association\n");
08f8ef8d   skhinach   modifs
89
90
  
  
1a2c5f60   skhinach   Quelques modifs f...
91
92
  	if(argument->interfaces[i]!=NULL)
  		argument->interfaces[i]->status=-1;
32c9271a   skhinach   modif
93
  
32c9271a   skhinach   modif
94
  
5940bf6e   skhinach   Quelques modifs
95
  	if(packet[0]==0x20 && (packet[1]==0x01 || packet[1]==0x00) )
a69a94a7   skhinach   Ajout de gestion ...
96
97
98
  	{		
  		//L'interface a correctement répondu, on la rajoute à la liste des interfaces
  		printf("L'interface a correctement répondu\n");
08f8ef8d   skhinach   modifs
99
  
1a2c5f60   skhinach   Quelques modifs f...
100
  		if(argument->interfaces[i]==NULL)
a69a94a7   skhinach   Ajout de gestion ...
101
  		{
1a2c5f60   skhinach   Quelques modifs f...
102
103
  			argument->interfaces[i]=malloc(sizeof(struct interface_info));
  			strcpy(argument->interfaces[i]->adresse, adresse);
a69a94a7   skhinach   Ajout de gestion ...
104
  		}
08f8ef8d   skhinach   modifs
105
  
a69a94a7   skhinach   Ajout de gestion ...
106
  		if(packet[1]==0x01)
1a2c5f60   skhinach   Quelques modifs f...
107
  			argument->interfaces[i]->status=1;
a69a94a7   skhinach   Ajout de gestion ...
108
  		else
1a2c5f60   skhinach   Quelques modifs f...
109
  			argument->interfaces[i]->status=0;		
08f8ef8d   skhinach   modifs
110
  
3e25c332   pifou   Big upload
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");
1a2c5f60   skhinach   Quelques modifs f...
117
  
a69a94a7   skhinach   Ajout de gestion ...
118
  		return -1;
5940bf6e   skhinach   Quelques modifs
119
  	}
08f8ef8d   skhinach   modifs
120
  
a69a94a7   skhinach   Ajout de gestion ...
121
122
123
124
  	strcpy(buffer, "\x60\x00"); // Demande la commande en mémoire
  
  	fprintf(sockdial_stream, "%s", buffer); // Transmission du message 
  
a69a94a7   skhinach   Ajout de gestion ...
125
  	fgets(packet, BUFF_SIZE, sockdial_stream); // Attente de reception du message
08f8ef8d   skhinach   modifs
126
  	
a69a94a7   skhinach   Ajout de gestion ...
127
  	if( strlen(packet)>=2 && (packet[0]&0xE0)==0x10 )
33777c91   skhinach   Test
128
  		argument->interfaces[i]->commande = (packet[0]&0x1F)*256+packet[1];
a69a94a7   skhinach   Ajout de gestion ...
129
130
  	else
  	{
967fa483   skhinach   Modifs finales
131
  		argument->interfaces[i]->commande = -1;
33777c91   skhinach   Test
132
  		//return -1; // Si le message n'est pas reçu correctement
a69a94a7   skhinach   Ajout de gestion ...
133
  	}
967fa483   skhinach   Modifs finales
134
135
136
  	
  	strcpy(buffer, "\xE0\x00"); // Signale la fin de l'interrogation
  
33777c91   skhinach   Test
137
  	fprintf(sockdial_stream, "%s", buffer); // Transmission du message
3e25c332   pifou   Big upload
138
  
1a2c5f60   skhinach   Quelques modifs f...
139
140
  	pthread_mutex_unlock(&(argument->requete_mutex)); // Libération de la section critique
  
a69a94a7   skhinach   Ajout de gestion ...
141
142
  	return 0;
  }
3e25c332   pifou   Big upload
143
  
3e25c332   pifou   Big upload
144
  
3e25c332   pifou   Big upload
145
  
a69a94a7   skhinach   Ajout de gestion ...
146
147
148
149
  void* reponseConnexion(void* arg_sock_interf)
  {	
  	Arg_Thread *argument=(Arg_Thread*)(arg_sock_interf);
  	int sock=argument->socket;
fff6f037   skhinach   modifs
150
  
a69a94a7   skhinach   Ajout de gestion ...
151
  	printf("Connected\n"); // Affiche le fait que qqn soit connecté
3e25c332   pifou   Big upload
152
  
a69a94a7   skhinach   Ajout de gestion ...
153
  	FILE* sockdial_stream = fdopen(sock, "a+"); 
3e25c332   pifou   Big upload
154
  
a69a94a7   skhinach   Ajout de gestion ...
155
156
  	char buff_rec[BUFF_SIZE]; // Le buffer de message à la reception
  	// char buffer[BUFF_SIZE];	// Le buffer de message pour l'emission
c35daaf6   Souheib Khinache   Organisation, cré...
157
  
5940bf6e   skhinach   Quelques modifs
158
  	printf("FGETS\n");
08f8ef8d   skhinach   modifs
159
160
  	fgets(buff_rec, BUFF_SIZE, sockdial_stream);
  	
a69a94a7   skhinach   Ajout de gestion ...
161
  	printf("Le message reçu : %s\n", buff_rec);
c35daaf6   Souheib Khinache   Organisation, cré...
162
  
5940bf6e   skhinach   Quelques modifs
163
  	
1a2c5f60   skhinach   Quelques modifs f...
164
  
5940bf6e   skhinach   Quelques modifs
165
  
a69a94a7   skhinach   Ajout de gestion ...
166
167
168
  	//Distingue la requête HTTP...
  	if(strstr(buff_rec, "GET")!=NULL && strstr(buff_rec, "HTTP")!=NULL)
  	{
1a2c5f60   skhinach   Quelques modifs f...
169
170
  		vider_interfaces(argument);	
  		httpReponse(sockdial_stream, argument);
a69a94a7   skhinach   Ajout de gestion ...
171
172
173
174
175
176
177
178
179
  	}
  	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));		
1a2c5f60   skhinach   Quelques modifs f...
180
  			interfaceReponse(sockdial_stream, buff_rec, argument, adresse); 
a69a94a7   skhinach   Ajout de gestion ...
181
182
  		}
  	}
32c9271a   skhinach   modif
183
  
5940bf6e   skhinach   Quelques modifs
184
  
a69a94a7   skhinach   Ajout de gestion ...
185
  	printf("Sock : %d // Stream : %p \n", sock, sockdial_stream);
32c9271a   skhinach   modif
186
  
32c9271a   skhinach   modif
187
  	printf("Fin de la connexion\n");
a69a94a7   skhinach   Ajout de gestion ...
188
  
32c9271a   skhinach   modif
189
  	fclose(sockdial_stream);
a69a94a7   skhinach   Ajout de gestion ...
190
  
32c9271a   skhinach   modif
191
192
193
194
  	pthread_exit(NULL);
  }
  
  
08f8ef8d   skhinach   modifs
195
  
32c9271a   skhinach   modif
196
197
198
199
200
201
202
203
204
205
  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;
  }