Blame view

Threads/threadSocket.c 4.06 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
  
a69a94a7   skhinach   Ajout de gestion ...
16
  void vider_interfaces(struct interface_info* interfaces[20])
3e25c332   pifou   Big upload
17
  {
a69a94a7   skhinach   Ajout de gestion ...
18
19
20
21
22
23
24
25
26
  	for(int i=0; i<20; i++)
  	{
  		if(interfaces[i]!=NULL)
  		{
  			free(interfaces[i]);
  			interfaces[i]=NULL;
  		}
  	}
  }
08f8ef8d   skhinach   modifs
27
28
  
  
a69a94a7   skhinach   Ajout de gestion ...
29
30
31
  int httpReponse(FILE* sockdial_stream, struct interface_info* interfaces[20])
  {	
  	char message[]={0x00,0x00};
08f8ef8d   skhinach   modifs
32
  
a69a94a7   skhinach   Ajout de gestion ...
33
  	sendUDPBroadcast(message, 2020);
fff6f037   skhinach   modifs
34
  
a69a94a7   skhinach   Ajout de gestion ...
35
  	struct PageWeb* page; 
fff6f037   skhinach   modifs
36
  
a69a94a7   skhinach   Ajout de gestion ...
37
  	sleep(0.5); // Temps d'attente avant de recevoir les informations
32c9271a   skhinach   modif
38
  
a69a94a7   skhinach   Ajout de gestion ...
39
  	createPage(&page, interfaces); // Permet de creer la pageweb (http.c)
08f8ef8d   skhinach   modifs
40
  
a69a94a7   skhinach   Ajout de gestion ...
41
42
  	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
43
  
a69a94a7   skhinach   Ajout de gestion ...
44
  	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
45
  
a69a94a7   skhinach   Ajout de gestion ...
46
  	fprintf(sockdial_stream, "%s", buffer);
08f8ef8d   skhinach   modifs
47
  
a69a94a7   skhinach   Ajout de gestion ...
48
  	strcpy(buffer, page->html_contents);
08f8ef8d   skhinach   modifs
49
  
a69a94a7   skhinach   Ajout de gestion ...
50
  	fprintf(sockdial_stream, "%s", buffer);
08f8ef8d   skhinach   modifs
51
  
a69a94a7   skhinach   Ajout de gestion ...
52
  	freePage(&page);
08f8ef8d   skhinach   modifs
53
  
a69a94a7   skhinach   Ajout de gestion ...
54
55
  	return 0;
  }
08f8ef8d   skhinach   modifs
56
  
08f8ef8d   skhinach   modifs
57
  
3e25c332   pifou   Big upload
58
  
a69a94a7   skhinach   Ajout de gestion ...
59
60
  
  int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct interface_info* interfaces[20], char adresse[20])
3e25c332   pifou   Big upload
61
  {
a69a94a7   skhinach   Ajout de gestion ...
62
63
64
65
66
67
  	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)
08f8ef8d   skhinach   modifs
68
  	{
a69a94a7   skhinach   Ajout de gestion ...
69
  		i++;	
08f8ef8d   skhinach   modifs
70
  	}
32c9271a   skhinach   modif
71
  	
a69a94a7   skhinach   Ajout de gestion ...
72
73
  	if(interfaces[0]!=NULL)
  		printf("Il y a %d associations\n", i+1);
3e25c332   pifou   Big upload
74
  	else
a69a94a7   skhinach   Ajout de gestion ...
75
  		printf("Il n'y aucune association\n");
08f8ef8d   skhinach   modifs
76
77
  
  
a69a94a7   skhinach   Ajout de gestion ...
78
79
  	if(interfaces[i]!=NULL)
  		interfaces[i]->status=-1;
32c9271a   skhinach   modif
80
  
32c9271a   skhinach   modif
81
  
a69a94a7   skhinach   Ajout de gestion ...
82
83
84
85
  	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");
08f8ef8d   skhinach   modifs
86
  
a69a94a7   skhinach   Ajout de gestion ...
87
88
89
90
91
  		if(interfaces[i]==NULL)
  		{
  			interfaces[i]=malloc(sizeof(struct interface_info));
  			strcpy(interfaces[i]->adresse, adresse);
  		}
08f8ef8d   skhinach   modifs
92
  
a69a94a7   skhinach   Ajout de gestion ...
93
94
95
96
  		if(packet[1]==0x01)
  			interfaces[i]->status=1;
  		else
  			interfaces[i]->status=0;		
08f8ef8d   skhinach   modifs
97
  
3e25c332   pifou   Big upload
98
  	}
a69a94a7   skhinach   Ajout de gestion ...
99
100
  	else // L'interface n a pas correctement répondu
  		return -1;
08f8ef8d   skhinach   modifs
101
  
08f8ef8d   skhinach   modifs
102
  
08f8ef8d   skhinach   modifs
103
  
a69a94a7   skhinach   Ajout de gestion ...
104
105
106
107
108
109
  	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
  
32c9271a   skhinach   modif
110
  
08f8ef8d   skhinach   modifs
111
  	
a69a94a7   skhinach   Ajout de gestion ...
112
113
114
115
116
117
118
  	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
  	}
3e25c332   pifou   Big upload
119
  
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
  
a69a94a7   skhinach   Ajout de gestion ...
130
  	printf("Connected\n"); // Affiche le fait que qqn soit connecté
3e25c332   pifou   Big upload
131
  
a69a94a7   skhinach   Ajout de gestion ...
132
  	FILE* sockdial_stream = fdopen(sock, "a+"); 
3e25c332   pifou   Big upload
133
  
a69a94a7   skhinach   Ajout de gestion ...
134
135
  	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é...
136
  
08f8ef8d   skhinach   modifs
137
138
  	fgets(buff_rec, BUFF_SIZE, sockdial_stream);
  	
a69a94a7   skhinach   Ajout de gestion ...
139
  	printf("Le message reçu : %s\n", buff_rec);
c35daaf6   Souheib Khinache   Organisation, cré...
140
  
a69a94a7   skhinach   Ajout de gestion ...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  	//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); 
  		}
  	}
32c9271a   skhinach   modif
158
  
a69a94a7   skhinach   Ajout de gestion ...
159
  	printf("Sock : %d // Stream : %p \n", sock, sockdial_stream);
32c9271a   skhinach   modif
160
  
32c9271a   skhinach   modif
161
  	printf("Fin de la connexion\n");
a69a94a7   skhinach   Ajout de gestion ...
162
  
32c9271a   skhinach   modif
163
  	fclose(sockdial_stream);
a69a94a7   skhinach   Ajout de gestion ...
164
  
32c9271a   skhinach   modif
165
166
167
168
  	pthread_exit(NULL);
  }
  
  
08f8ef8d   skhinach   modifs
169
  
32c9271a   skhinach   modif
170
171
172
173
174
175
176
177
178
179
  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;
  }