Commit 5940bf6e60d8f8f9d2d0f1ef2c55324abf97d67e
1 parent
6c0230af
Quelques modifs
Showing
15 changed files
with
92 additions
and
101 deletions
Show diff stats
Makefile
Network/Makefile
Network/sender.c
... | ... | @@ -21,7 +21,7 @@ int initializeSocketUDP(char* service) |
21 | 21 | //precisions.ai_flags = AI_PASSIVE; |
22 | 22 | |
23 | 23 | /*"172.26.145.35"*/ |
24 | - if(getaddrinfo(NULL, service, &precisions, &origine)<0) { fprintf(stderr, "Erreur getaddrinfo\n"); return(-1); } | |
24 | + if(getaddrinfo("192.168.1.66", service, &precisions, &origine)<0) { fprintf(stderr, "Erreur getaddrinfo\n"); return(-1); } | |
25 | 25 | |
26 | 26 | int n=0; |
27 | 27 | ... | ... |
Network/sniffer.c
... | ... | @@ -4,12 +4,15 @@ |
4 | 4 | #include <string.h> |
5 | 5 | #include <netinet/in.h> |
6 | 6 | #include <arpa/inet.h> |
7 | +#include <time.h> | |
8 | +#include "libnet.h" | |
9 | + | |
7 | 10 | |
8 | 11 | #define SZ_DEV_PCAP 10 |
9 | 12 | |
10 | 13 | |
11 | 14 | // Fonction lors de la detection d'un paquet |
12 | -void arp_detect(/*u_char *args, const struct pcap_pkthdr *header, const u_char *packet*/) | |
15 | +void arp_detect() | |
13 | 16 | { |
14 | 17 | static int num=0, loop=1; |
15 | 18 | num++; |
... | ... | @@ -18,6 +21,25 @@ void arp_detect(/*u_char *args, const struct pcap_pkthdr *header, const u_char * |
18 | 21 | if(num==10) { loop++; num=0; printf("10 paquets ARP ont été reçus pour la boucle %d !\n", loop);} |
19 | 22 | } |
20 | 23 | |
24 | + | |
25 | +// Issue du dépassement de seuil de paquets, gère en fonction du débit moyen de reception de paquets arp | |
26 | +void reponseSonde(time_t last_time, time_t seuil_temps) | |
27 | +{ | |
28 | + time_t ecart = time(NULL) - last_time; | |
29 | + char* msg1="00"; | |
30 | + char* msg2="01"; | |
31 | + | |
32 | + if(ecart > seuil_temps) | |
33 | + { | |
34 | + sendUDPBroadcast(msg1,2020); | |
35 | + } | |
36 | + else | |
37 | + { | |
38 | + sendUDPBroadcast(msg2,2020); | |
39 | + } | |
40 | +} | |
41 | + | |
42 | +// La fonction va initialiser la sonde réseau | |
21 | 43 | int initialize_sniffer(pcap_t** dev_handle, char dev[]) |
22 | 44 | { |
23 | 45 | bpf_u_int32 mask; // Masque de l'adresse réseau de l'interface à sniffer |
... | ... | @@ -30,15 +52,11 @@ int initialize_sniffer(pcap_t** dev_handle, char dev[]) |
30 | 52 | int status; |
31 | 53 | |
32 | 54 | |
33 | - | |
34 | - | |
35 | 55 | // Permet d'obtenir l'adresse ip de l'interface demandée*/ |
36 | 56 | /* pcap permet de lister les interfaces et obtenir les adresses ip de ces dernières |
37 | 57 | * On utilise la fonction pcap_findalldevs |
38 | 58 | */ |
39 | 59 | |
40 | - | |
41 | - | |
42 | 60 | pcap_if_t* interfaces; |
43 | 61 | |
44 | 62 | if(pcap_findalldevs(&interfaces, buf_err)!=0) { printf("%s\n", buf_err); return(EXIT_FAILURE); } |
... | ... | @@ -120,56 +138,27 @@ int initialize_sniffer(pcap_t** dev_handle, char dev[]) |
120 | 138 | |
121 | 139 | } |
122 | 140 | |
123 | -int ecouteReseau(int argc, char* argv[]) | |
124 | -{ | |
125 | - int cnt=10; // Correspond au nombre de paquets arp | |
126 | - | |
127 | - char dev[SZ_DEV_PCAP]; // Nom de l'interface à sniffer | |
128 | - pcap_t *dev_handle; // Handle vers le device (correspondant à l'interface à sniffer) | |
129 | - | |
130 | - | |
131 | 141 | |
132 | - // Vérifie si le device a été donné | |
133 | - // ------------------------ | |
142 | +int ecouteReseau(char* dev) | |
143 | +{ | |
144 | + int cnt=10; // Correspond au seuil de paquets arp à compter | |
134 | 145 | |
135 | - int dev_donne=0; | |
146 | + time_t last_time_reponse; // Correspond au moment du démarrage du cycle de la sonde | |
136 | 147 | |
137 | - for(int i=1; i<argc-1; i++) | |
138 | - { | |
139 | - if(strcmp(argv[i], "-dev")==0 || strcmp(argv[i], "-d")==0) | |
140 | - { | |
141 | - strcpy(dev, argv[i+1]); | |
142 | - dev_donne=1; | |
143 | - } | |
144 | - } | |
145 | - | |
146 | - if(!dev_donne) | |
147 | - strcpy(dev, "eth0"); | |
148 | + pcap_t *dev_handle; // Handle vers le device (correspondant à l'interface à sniffer) | |
148 | 149 | |
149 | 150 | printf("Device: %s\n", dev); |
150 | - | |
151 | - // ------------------------ | |
152 | - | |
153 | - | |
154 | - | |
155 | - | |
156 | - // struct pcap_pkthdr packet_header; // Header du paquet comportant des informations sur la réception du paquet (temps de reception etc...) | |
157 | - // const u_char *packet; // Contenant du paquet | |
158 | 151 | |
159 | - if(initialize_sniffer(&dev_handle, dev)!=0) return(-1); | |
152 | + if(initialize_sniffer(&dev_handle, dev)!=0) return(-1); // Initialisation du sniffer | |
160 | 153 | |
161 | - pcap_loop(dev_handle, cnt, arp_detect, NULL); // Boucle jusque 10 paquets arp reçus | |
154 | + while(1) | |
155 | + { | |
156 | + last_time_reponse = time(NULL); | |
157 | + pcap_loop(dev_handle, cnt, arp_detect, NULL); // Boucle jusque [cnt] paquets arp reçus | |
158 | + reponseSonde(last_time_reponse, 20); // Une fois que le seuil de temps est passé | |
159 | + } | |
162 | 160 | |
163 | 161 | return 0; |
164 | 162 | } |
165 | 163 | |
166 | -/* | |
167 | - | |
168 | -int main(int argc, char *argv[]) | |
169 | -{ | |
170 | - ecouteReseau(argc, argv); | |
171 | - | |
172 | - return(0); | |
173 | -} | |
174 | 164 | |
175 | -*/ | ... | ... |
Network/tcpserver.c
... | ... | @@ -6,6 +6,9 @@ |
6 | 6 | #include <string.h> |
7 | 7 | #include <netdb.h> |
8 | 8 | #include <arpa/inet.h> |
9 | +#include <pthread.h> | |
10 | + | |
11 | + | |
9 | 12 | #include "libthrd.h" |
10 | 13 | |
11 | 14 | |
... | ... | @@ -68,6 +71,9 @@ int boucleServeur(int socket, void(* fctConnex)(int)) |
68 | 71 | //On utilisera la structure Arg_Thread (définie dans libthrd.h) qui comprend la socket de dialogue et le tableau pointeurs vers une structure donnant les infos des interfaces. |
69 | 72 | //En effet, cette structure d'informations d'interface permet d'être utilisée comme une base de données, comprenant l'adresse de l'interface et son statut |
70 | 73 | //Les threads partageant la mémoire, ces infos seront partagées. |
74 | + //Afin de gérer les requêtes, il est nécessaire d'instaurer un mutex. | |
75 | + //En effet, la ressource interfaces ne doit être accessible que par un seul thread à la fois | |
76 | + | |
71 | 77 | Arg_Thread arg_sock_interf; |
72 | 78 | |
73 | 79 | //On initialise les interfaces |
... | ... | @@ -75,6 +81,9 @@ int boucleServeur(int socket, void(* fctConnex)(int)) |
75 | 81 | arg_sock_interf.interfaces[i]=NULL; |
76 | 82 | |
77 | 83 | |
84 | + //On initialiser le mutex | |
85 | + pthread_mutex_init(&(arg_sock_interf.requete_mutex), NULL); | |
86 | + | |
78 | 87 | printf("------- Début boucle serveur TCP -------\n\n"); |
79 | 88 | |
80 | 89 | while(1) |
... | ... | @@ -87,5 +96,7 @@ int boucleServeur(int socket, void(* fctConnex)(int)) |
87 | 96 | |
88 | 97 | lanceThread((void*)fctConnex, (void*)&arg_sock_interf, sizeof(arg_sock_interf)); |
89 | 98 | } |
99 | + | |
100 | + pthread_mutex_destroy(&(arg_sock_interf.requete_mutex)); | |
90 | 101 | } |
91 | 102 | ... | ... |
Threads/threadSocket.c
... | ... | @@ -34,7 +34,7 @@ int httpReponse(FILE* sockdial_stream, struct interface_info* interfaces[20]) |
34 | 34 | |
35 | 35 | struct PageWeb* page; |
36 | 36 | |
37 | - sleep(0.5); // Temps d'attente avant de recevoir les informations | |
37 | + sleep(2); // Temps d'attente avant de recevoir les informations | |
38 | 38 | |
39 | 39 | createPage(&page, interfaces); // Permet de creer la pageweb (http.c) |
40 | 40 | |
... | ... | @@ -59,7 +59,7 @@ int httpReponse(FILE* sockdial_stream, struct interface_info* interfaces[20]) |
59 | 59 | |
60 | 60 | int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct interface_info* interfaces[20], char adresse[20]) |
61 | 61 | { |
62 | - printf("Interface : %s - Adresse : %s\n", packet, adresse); | |
62 | + printf("Interface : %x %x - Adresse : %s - Taille : %ld\n", packet[0], packet[1], adresse, strlen(packet)); | |
63 | 63 | |
64 | 64 | char buffer[BUFF_SIZE]; |
65 | 65 | |
... | ... | @@ -79,7 +79,7 @@ int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct inter |
79 | 79 | interfaces[i]->status=-1; |
80 | 80 | |
81 | 81 | |
82 | - if(strlen(packet)>=2 && packet[0]=='A' && (packet[1]=='A' || packet[1]=='B') ) | |
82 | + if(packet[0]==0x20 && (packet[1]==0x01 || packet[1]==0x00) ) | |
83 | 83 | { |
84 | 84 | //L'interface a correctement répondu, on la rajoute à la liste des interfaces |
85 | 85 | printf("L'interface a correctement répondu\n"); |
... | ... | @@ -96,15 +96,18 @@ int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct inter |
96 | 96 | interfaces[i]->status=0; |
97 | 97 | |
98 | 98 | } |
99 | - else // L'interface n a pas correctement répondu | |
99 | + else | |
100 | + { // L'interface n a pas correctement répondu | |
101 | + printf("L'interface n'a pas correctement répondu\n"); | |
100 | 102 | return -1; |
103 | + } | |
101 | 104 | |
102 | - | |
103 | - | |
105 | + /* | |
104 | 106 | strcpy(buffer, "\x60\x00"); // Demande la commande en mémoire |
105 | 107 | |
106 | 108 | fprintf(sockdial_stream, "%s", buffer); // Transmission du message |
107 | 109 | |
110 | + | |
108 | 111 | fgets(packet, BUFF_SIZE, sockdial_stream); // Attente de reception du message |
109 | 112 | |
110 | 113 | |
... | ... | @@ -116,6 +119,7 @@ int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct inter |
116 | 119 | interfaces[i]->commande = -1; |
117 | 120 | return -1; // Si le message n'est pas reçu correctement |
118 | 121 | } |
122 | + */ | |
119 | 123 | |
120 | 124 | return 0; |
121 | 125 | } |
... | ... | @@ -134,10 +138,14 @@ void* reponseConnexion(void* arg_sock_interf) |
134 | 138 | char buff_rec[BUFF_SIZE]; // Le buffer de message à la reception |
135 | 139 | // char buffer[BUFF_SIZE]; // Le buffer de message pour l'emission |
136 | 140 | |
141 | + printf("FGETS\n"); | |
137 | 142 | fgets(buff_rec, BUFF_SIZE, sockdial_stream); |
138 | 143 | |
139 | 144 | printf("Le message reçu : %s\n", buff_rec); |
140 | 145 | |
146 | + | |
147 | + //pthread_mutex_lock(&(argument->requete_mutex)); | |
148 | + | |
141 | 149 | //Distingue la requête HTTP... |
142 | 150 | if(strstr(buff_rec, "GET")!=NULL && strstr(buff_rec, "HTTP")!=NULL) |
143 | 151 | { |
... | ... | @@ -156,6 +164,8 @@ void* reponseConnexion(void* arg_sock_interf) |
156 | 164 | } |
157 | 165 | } |
158 | 166 | |
167 | + //pthread_mutex_unlock(&(argument->requete_mutex)); | |
168 | + | |
159 | 169 | printf("Sock : %d // Stream : %p \n", sock, sockdial_stream); |
160 | 170 | |
161 | 171 | printf("Fin de la connexion\n"); | ... | ... |
bin/serverTCP deleted
No preview for this file type
bin/sonde deleted
No preview for this file type
includes/libnet.h
... | ... | @@ -11,9 +11,9 @@ int initialisationServeur(char* service); |
11 | 11 | int initializeSocketUDP(char* service); |
12 | 12 | int sendUDPBroadcast(char* message, int port); |
13 | 13 | int sendUDPUnicast(char* address, char* message, int port); |
14 | -void arp_detect(u_char *args, const struct pcap_pkthdr *header, const u_char *packet); | |
14 | +void arp_detect(); | |
15 | 15 | int initialize_sniffer(pcap_t** dev_handle, char dev[]); |
16 | -int ecouteReseau(int argc, char* argv[]); | |
16 | +int ecouteReseau(char* device); | |
17 | 17 | |
18 | 18 | |
19 | 19 | ... | ... |
includes/libthrd.h
1 | 1 | #ifndef __LIBTHRD_H__ |
2 | 2 | #define __LIBTHRD_H__ |
3 | 3 | |
4 | + | |
4 | 5 | #include "http.h" |
6 | +#include <pthread.h> | |
5 | 7 | |
6 | -typedef struct{int socket; struct interface_info* interfaces[20];} Arg_Thread; | |
8 | +typedef struct{int socket; struct interface_info* interfaces[20]; pthread_mutex_t requete_mutex;} Arg_Thread; | |
7 | 9 | |
8 | 10 | void* reponseConnexion(void* arg_sock_interf); |
9 | 11 | ... | ... |
libs/libnet.a deleted
No preview for this file type
libs/libthrd.a deleted
No preview for this file type
bin/Makefile renamed to src/Makefile
1 | 1 | |
2 | 2 | CC=gcc |
3 | 3 | CFLAGS=-W -Wall -Wextra -g |
4 | -CLIBS=ar -rcs | |
5 | -LIB=libnet.a libthrd.a | |
4 | +CDIR=../bin/ | |
5 | +LIB=libthrd.a libnet.a | |
6 | 6 | LDIR=../libs/ |
7 | -LIBS=$(LDIR)libnet.a $(LDIR)libthrd.a | |
7 | +LIBS=$(LDIR)libthrd.a $(LDIR)libnet.a | |
8 | 8 | IDIR=../includes/ |
9 | 9 | LDFLAGS=-lpthread -lpcap |
10 | 10 | |
... | ... | @@ -13,16 +13,12 @@ LDFLAGS=-lpthread -lpcap |
13 | 13 | all: sonde serverTCP |
14 | 14 | |
15 | 15 | serverTCP: serverTCP.c |
16 | - cd ../Threads/ && make | |
17 | - cd ../Network/ && make | |
18 | - $(CC) -o $@ $< -I$(IDIR) -L$(LDIR) $(LDIR)libthrd.a $(LDIR)libnet.a $(CFLAGS) $(LDFLAGS) | |
16 | + $(CC) -o $(CDIR)$@ $< -I$(IDIR) -L$(LDIR) $(LIBS) $(CFLAGS) $(LDFLAGS) | |
19 | 17 | rm -f *.o |
20 | 18 | |
21 | 19 | |
22 | 20 | sonde: sonde.c |
23 | - cd ../Threads/ && make | |
24 | - cd ../Network/ && make | |
25 | - $(CC) -o $@ $< -I$(IDIR) $(LDIR)libnet.a $(LDIR)libthrd.a $(CFLAGS) $(LDFLAGS) | |
21 | + $(CC) -o $(CDIR)$@ $< -I$(IDIR) $(LIBS) $(CFLAGS) $(LDFLAGS) | |
26 | 22 | rm -f *.o |
27 | 23 | |
28 | 24 | # |
... | ... | @@ -30,11 +26,6 @@ sonde: sonde.c |
30 | 26 | # |
31 | 27 | |
32 | 28 | clean: |
33 | - cd ../Threads/ && make clean | |
34 | - cd ../Network/ && make clean | |
35 | - rm -f *.o sonde serverTCP | |
29 | + rm -f *.o $(CDIR)sonde $(CDIR)serverTCP | |
36 | 30 | |
37 | 31 | |
38 | -# cd ../Threads/ && make | |
39 | -# cd ../Network/ && make | |
40 | - | ... | ... |
bin/serverTCP.c renamed to src/serverTCP.c
bin/sonde.c renamed to src/sonde.c
... | ... | @@ -5,12 +5,14 @@ |
5 | 5 | #include <string.h> |
6 | 6 | #include <signal.h> |
7 | 7 | #include "libnet.h" |
8 | -#include <time.h> | |
8 | + | |
9 | 9 | |
10 | 10 | int sock_fd; |
11 | 11 | |
12 | 12 | struct sigaction action; |
13 | 13 | |
14 | + | |
15 | + | |
14 | 16 | void handler(int sig) |
15 | 17 | { |
16 | 18 | if(sig==SIGINT) |
... | ... | @@ -22,52 +24,38 @@ void handler(int sig) |
22 | 24 | } |
23 | 25 | |
24 | 26 | |
25 | -void argPortParsing(int argc, char* argv[], char* port) | |
27 | +void argPortParsing(int argc, char* argv[], char* device) | |
26 | 28 | { |
27 | - struct option port_arg={"port", 1, NULL, 'p'}; // | |
29 | + struct option port_arg={"dev", 1, NULL, 'd'}; | |
28 | 30 | char opt; |
29 | 31 | int longindex; |
30 | 32 | |
31 | - while( (opt=getopt_long(argc, argv, "p:", &port_arg, &longindex)) !='p' && opt!=-1) {} | |
33 | + while( (opt=getopt_long(argc, argv, "d:", &port_arg, &longindex)) !='d' && opt!=-1) {} | |
32 | 34 | |
33 | - if(opt=='p') | |
35 | + if(opt=='d') | |
34 | 36 | { |
35 | - strcpy(port, optarg); | |
37 | + strcpy(device, optarg); | |
36 | 38 | printf("%s\n", optarg); |
37 | 39 | } |
38 | 40 | else |
39 | 41 | { |
40 | - printf("La syntaxe doit être de la forme %s -p <port> ou %s --port <port>\n\n", argv[0], argv[0]); | |
42 | + strcpy(device, "eth0"); | |
41 | 43 | } |
42 | 44 | } |
43 | 45 | |
44 | 46 | |
45 | 47 | int main(int argc, char* argv[]) |
46 | 48 | { |
47 | -/* | |
48 | - char port[10]="80"; | |
49 | - argPortParsing(argc, argv, port); | |
50 | - | |
51 | - action.sa_handler=&handler; | |
52 | - sigaction(SIGINT, &action, NULL); | |
53 | - | |
54 | - if( (sock_fd=initialisationServeur(port)) ==-1 ) { fprintf(stderr, "Initialisation du serveur impossible\n"); return -1; } | |
49 | + char device[100]; // On stockera le nom de l'interface | |
50 | + argPortParsing(argc, argv, device); // On vérifie les arguments si il y a | |
55 | 51 | |
56 | - boucleServeur(sock_fd, (void*)&reponseConnexion); | |
52 | + // On met en place la détection d'interruption | |
53 | + action.sa_handler=&handler; | |
54 | + sigaction(SIGINT, &action, NULL); | |
57 | 55 | |
56 | + // Fonction d'écoute du réseau | |
57 | + if(ecouteReseau(device)!=0){ return -1;} | |
58 | 58 | |
59 | - sendUDPBroadcast("BroadWesh", 2020); | |
60 | - sendUDPUnicast("192.168.0.37", "Coucou", 2020); | |
61 | - */ | |
62 | - | |
63 | - char msg[2] = {0x40,0x01}; | |
64 | - | |
65 | - while(1) | |
66 | - { | |
67 | - if(ecouteReseau(argc, argv)!=0){ return -1;} | |
68 | - if(sendUDPBroadcast(msg, 2020)){ return -1;} | |
69 | - //sendUDPUnicast("172.26.145.205",msg, 2020); | |
70 | - } | |
71 | 59 | return 0; |
72 | 60 | } |
73 | 61 | ... | ... |