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;
}
|