From 5940bf6e60d8f8f9d2d0f1ef2c55324abf97d67e Mon Sep 17 00:00:00 2001 From: skhinach Date: Mon, 22 Apr 2019 22:29:25 +0200 Subject: [PATCH] Quelques modifs --- Makefile | 2 +- Network/Makefile | 2 +- Network/sender.c | 2 +- Network/sniffer.c | 81 +++++++++++++++++++++++++++++++++++---------------------------------------------- Network/tcpserver.c | 11 +++++++++++ Threads/threadSocket.c | 22 ++++++++++++++++------ bin/Makefile | 40 ---------------------------------------- bin/serverTCP | Bin 41392 -> 0 bytes bin/serverTCP.c | 60 ------------------------------------------------------------ bin/sonde | Bin 30568 -> 0 bytes bin/sonde.c | 73 ------------------------------------------------------------------------- includes/libnet.h | 4 ++-- includes/libthrd.h | 4 +++- libs/libnet.a | Bin 42032 -> 0 bytes libs/libthrd.a | Bin 28422 -> 0 bytes src/Makefile | 31 +++++++++++++++++++++++++++++++ src/serverTCP.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/sonde.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 18 files changed, 222 insertions(+), 231 deletions(-) delete mode 100755 bin/Makefile delete mode 100755 bin/serverTCP delete mode 100644 bin/serverTCP.c delete mode 100755 bin/sonde delete mode 100755 bin/sonde.c delete mode 100644 libs/libnet.a delete mode 100644 libs/libthrd.a create mode 100755 src/Makefile create mode 100644 src/serverTCP.c create mode 100755 src/sonde.c diff --git a/Makefile b/Makefile index 8834878..f9e244c 100755 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ export CDEBUG = -g -DDEBUG # Constantes liees au projet # -DIRS=Network Threads +DIRS=Network Threads src # # La cible generale diff --git a/Network/Makefile b/Network/Makefile index f4efab8..1959a1f 100755 --- a/Network/Makefile +++ b/Network/Makefile @@ -26,7 +26,7 @@ tcpserver.o: tcpserver.c $(CC) -o $@ -c $^ -I$(IDIR) $(CFLAGS) sniffer.o: sniffer.c - $(CC) -o $@ -c $^ $(CFLAGS) + $(CC) -o $@ -c $^ -I$(IDIR) $(CFLAGS) sender.o: sender.c $(CC) -o $@ -c $^ $(CFLAGS) diff --git a/Network/sender.c b/Network/sender.c index fe0fab6..a6fd979 100755 --- a/Network/sender.c +++ b/Network/sender.c @@ -21,7 +21,7 @@ int initializeSocketUDP(char* service) //precisions.ai_flags = AI_PASSIVE; /*"172.26.145.35"*/ - if(getaddrinfo(NULL, service, &precisions, &origine)<0) { fprintf(stderr, "Erreur getaddrinfo\n"); return(-1); } + if(getaddrinfo("192.168.1.66", service, &precisions, &origine)<0) { fprintf(stderr, "Erreur getaddrinfo\n"); return(-1); } int n=0; diff --git a/Network/sniffer.c b/Network/sniffer.c index 4b8bf66..c13afbb 100755 --- a/Network/sniffer.c +++ b/Network/sniffer.c @@ -4,12 +4,15 @@ #include #include #include +#include +#include "libnet.h" + #define SZ_DEV_PCAP 10 // Fonction lors de la detection d'un paquet -void arp_detect(/*u_char *args, const struct pcap_pkthdr *header, const u_char *packet*/) +void arp_detect() { static int num=0, loop=1; num++; @@ -18,6 +21,25 @@ void arp_detect(/*u_char *args, const struct pcap_pkthdr *header, const u_char * if(num==10) { loop++; num=0; printf("10 paquets ARP ont été reçus pour la boucle %d !\n", loop);} } + +// Issue du dépassement de seuil de paquets, gère en fonction du débit moyen de reception de paquets arp +void reponseSonde(time_t last_time, time_t seuil_temps) +{ + time_t ecart = time(NULL) - last_time; + char* msg1="00"; + char* msg2="01"; + + if(ecart > seuil_temps) + { + sendUDPBroadcast(msg1,2020); + } + else + { + sendUDPBroadcast(msg2,2020); + } +} + +// La fonction va initialiser la sonde réseau int initialize_sniffer(pcap_t** dev_handle, char dev[]) { 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[]) int status; - - // Permet d'obtenir l'adresse ip de l'interface demandée*/ /* pcap permet de lister les interfaces et obtenir les adresses ip de ces dernières * On utilise la fonction pcap_findalldevs */ - - pcap_if_t* interfaces; 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[]) } -int ecouteReseau(int argc, char* argv[]) -{ - int cnt=10; // Correspond au nombre de paquets arp - - char dev[SZ_DEV_PCAP]; // Nom de l'interface à sniffer - pcap_t *dev_handle; // Handle vers le device (correspondant à l'interface à sniffer) - - - // Vérifie si le device a été donné - // ------------------------ +int ecouteReseau(char* dev) +{ + int cnt=10; // Correspond au seuil de paquets arp à compter - int dev_donne=0; + time_t last_time_reponse; // Correspond au moment du démarrage du cycle de la sonde - for(int i=1; i #include #include +#include + + #include "libthrd.h" @@ -68,6 +71,9 @@ int boucleServeur(int socket, void(* fctConnex)(int)) //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. //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 //Les threads partageant la mémoire, ces infos seront partagées. + //Afin de gérer les requêtes, il est nécessaire d'instaurer un mutex. + //En effet, la ressource interfaces ne doit être accessible que par un seul thread à la fois + Arg_Thread arg_sock_interf; //On initialise les interfaces @@ -75,6 +81,9 @@ int boucleServeur(int socket, void(* fctConnex)(int)) arg_sock_interf.interfaces[i]=NULL; + //On initialiser le mutex + pthread_mutex_init(&(arg_sock_interf.requete_mutex), NULL); + printf("------- Début boucle serveur TCP -------\n\n"); while(1) @@ -87,5 +96,7 @@ int boucleServeur(int socket, void(* fctConnex)(int)) lanceThread((void*)fctConnex, (void*)&arg_sock_interf, sizeof(arg_sock_interf)); } + + pthread_mutex_destroy(&(arg_sock_interf.requete_mutex)); } diff --git a/Threads/threadSocket.c b/Threads/threadSocket.c index 877adaa..b683851 100755 --- a/Threads/threadSocket.c +++ b/Threads/threadSocket.c @@ -34,7 +34,7 @@ int httpReponse(FILE* sockdial_stream, struct interface_info* interfaces[20]) struct PageWeb* page; - sleep(0.5); // Temps d'attente avant de recevoir les informations + sleep(2); // Temps d'attente avant de recevoir les informations createPage(&page, interfaces); // Permet de creer la pageweb (http.c) @@ -59,7 +59,7 @@ int httpReponse(FILE* sockdial_stream, struct interface_info* interfaces[20]) int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct interface_info* interfaces[20], char adresse[20]) { - printf("Interface : %s - Adresse : %s\n", packet, adresse); + printf("Interface : %x %x - Adresse : %s - Taille : %ld\n", packet[0], packet[1], adresse, strlen(packet)); char buffer[BUFF_SIZE]; @@ -79,7 +79,7 @@ int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct inter interfaces[i]->status=-1; - if(strlen(packet)>=2 && packet[0]=='A' && (packet[1]=='A' || packet[1]=='B') ) + if(packet[0]==0x20 && (packet[1]==0x01 || packet[1]==0x00) ) { //L'interface a correctement répondu, on la rajoute à la liste des interfaces printf("L'interface a correctement répondu\n"); @@ -96,15 +96,18 @@ int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct inter interfaces[i]->status=0; } - else // L'interface n a pas correctement répondu + else + { // L'interface n a pas correctement répondu + printf("L'interface n'a pas correctement répondu\n"); return -1; + } - - + /* 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 @@ -116,6 +119,7 @@ int interfaceReponse(FILE* sockdial_stream, char packet[BUFF_SIZE], struct inter interfaces[i]->commande = -1; return -1; // Si le message n'est pas reçu correctement } + */ return 0; } @@ -134,10 +138,14 @@ void* reponseConnexion(void* arg_sock_interf) char buff_rec[BUFF_SIZE]; // Le buffer de message à la reception // char buffer[BUFF_SIZE]; // Le buffer de message pour l'emission + printf("FGETS\n"); fgets(buff_rec, BUFF_SIZE, sockdial_stream); printf("Le message reçu : %s\n", buff_rec); + + //pthread_mutex_lock(&(argument->requete_mutex)); + //Distingue la requête HTTP... if(strstr(buff_rec, "GET")!=NULL && strstr(buff_rec, "HTTP")!=NULL) { @@ -156,6 +164,8 @@ void* reponseConnexion(void* arg_sock_interf) } } + //pthread_mutex_unlock(&(argument->requete_mutex)); + printf("Sock : %d // Stream : %p \n", sock, sockdial_stream); printf("Fin de la connexion\n"); diff --git a/bin/Makefile b/bin/Makefile deleted file mode 100755 index f8e2c03..0000000 --- a/bin/Makefile +++ /dev/null @@ -1,40 +0,0 @@ - -CC=gcc -CFLAGS=-W -Wall -Wextra -g -CLIBS=ar -rcs -LIB=libnet.a libthrd.a -LDIR=../libs/ -LIBS=$(LDIR)libnet.a $(LDIR)libthrd.a -IDIR=../includes/ -LDFLAGS=-lpthread -lpcap - - - -all: sonde serverTCP - -serverTCP: serverTCP.c - cd ../Threads/ && make - cd ../Network/ && make - $(CC) -o $@ $< -I$(IDIR) -L$(LDIR) $(LDIR)libthrd.a $(LDIR)libnet.a $(CFLAGS) $(LDFLAGS) - rm -f *.o - - -sonde: sonde.c - cd ../Threads/ && make - cd ../Network/ && make - $(CC) -o $@ $< -I$(IDIR) $(LDIR)libnet.a $(LDIR)libthrd.a $(CFLAGS) $(LDFLAGS) - rm -f *.o - -# -# La cible de nettoyage -# - -clean: - cd ../Threads/ && make clean - cd ../Network/ && make clean - rm -f *.o sonde serverTCP - - -# cd ../Threads/ && make -# cd ../Network/ && make - diff --git a/bin/serverTCP b/bin/serverTCP deleted file mode 100755 index f132b95..0000000 Binary files a/bin/serverTCP and /dev/null differ diff --git a/bin/serverTCP.c b/bin/serverTCP.c deleted file mode 100644 index 5d24594..0000000 --- a/bin/serverTCP.c +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "libnet.h" -#include - -int sock_fd; - -struct sigaction action; - -void handler(int sig) -{ - if(sig==SIGINT) - { - printf("\nINTERRUPTION SOCKET : %d\n\n", sock_fd); - close(sock_fd); - exit(1); - } -} - - -void argPortParsing(int argc, char* argv[], char* port) -{ - struct option port_arg={"port", 1, NULL, 'p'}; // - char opt; - int longindex; - - while( (opt=getopt_long(argc, argv, "p:", &port_arg, &longindex)) !='p' && opt!=-1) {} - - if(opt=='p') - { - strcpy(port, optarg); //optarg est une variable instanciée dans la librairie getopt - printf("%s\n", optarg); - } - else - { - printf("La syntaxe doit être de la forme %s -p ou %s --port \n\n", argv[0], argv[0]); - } -} - - -int main(int argc, char* argv[]) -{ - - char port[10]="80"; - argPortParsing(argc, argv, port); - - action.sa_handler=&handler; - sigaction(SIGINT, &action, NULL); - - if( (sock_fd=initialisationServeur(port)) ==-1 ) { fprintf(stderr, "Initialisation du serveur impossible\n"); return -1; } - - boucleServeur(sock_fd, (void*)&reponseConnexion); - - return 0; -} - diff --git a/bin/sonde b/bin/sonde deleted file mode 100755 index 08a4a9d..0000000 Binary files a/bin/sonde and /dev/null differ diff --git a/bin/sonde.c b/bin/sonde.c deleted file mode 100755 index 2206667..0000000 --- a/bin/sonde.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "libnet.h" -#include - -int sock_fd; - -struct sigaction action; - -void handler(int sig) -{ - if(sig==SIGINT) - { - printf("\nINTERRUPTION SOCKET : %d\n\n", sock_fd); - close(sock_fd); - exit(1); - } -} - - -void argPortParsing(int argc, char* argv[], char* port) -{ - struct option port_arg={"port", 1, NULL, 'p'}; // - char opt; - int longindex; - - while( (opt=getopt_long(argc, argv, "p:", &port_arg, &longindex)) !='p' && opt!=-1) {} - - if(opt=='p') - { - strcpy(port, optarg); - printf("%s\n", optarg); - } - else - { - printf("La syntaxe doit être de la forme %s -p ou %s --port \n\n", argv[0], argv[0]); - } -} - - -int main(int argc, char* argv[]) -{ -/* - char port[10]="80"; - argPortParsing(argc, argv, port); - - action.sa_handler=&handler; - sigaction(SIGINT, &action, NULL); - - if( (sock_fd=initialisationServeur(port)) ==-1 ) { fprintf(stderr, "Initialisation du serveur impossible\n"); return -1; } - - boucleServeur(sock_fd, (void*)&reponseConnexion); - - - sendUDPBroadcast("BroadWesh", 2020); - sendUDPUnicast("192.168.0.37", "Coucou", 2020); - */ - - char msg[2] = {0x40,0x01}; - - while(1) - { - if(ecouteReseau(argc, argv)!=0){ return -1;} - if(sendUDPBroadcast(msg, 2020)){ return -1;} - //sendUDPUnicast("172.26.145.205",msg, 2020); - } - return 0; -} - diff --git a/includes/libnet.h b/includes/libnet.h index 16c6efb..33cbc0d 100755 --- a/includes/libnet.h +++ b/includes/libnet.h @@ -11,9 +11,9 @@ int initialisationServeur(char* service); int initializeSocketUDP(char* service); int sendUDPBroadcast(char* message, int port); int sendUDPUnicast(char* address, char* message, int port); -void arp_detect(u_char *args, const struct pcap_pkthdr *header, const u_char *packet); +void arp_detect(); int initialize_sniffer(pcap_t** dev_handle, char dev[]); -int ecouteReseau(int argc, char* argv[]); +int ecouteReseau(char* device); diff --git a/includes/libthrd.h b/includes/libthrd.h index a4e28a0..7095227 100755 --- a/includes/libthrd.h +++ b/includes/libthrd.h @@ -1,9 +1,11 @@ #ifndef __LIBTHRD_H__ #define __LIBTHRD_H__ + #include "http.h" +#include -typedef struct{int socket; struct interface_info* interfaces[20];} Arg_Thread; +typedef struct{int socket; struct interface_info* interfaces[20]; pthread_mutex_t requete_mutex;} Arg_Thread; void* reponseConnexion(void* arg_sock_interf); diff --git a/libs/libnet.a b/libs/libnet.a deleted file mode 100644 index 88e7d0e..0000000 Binary files a/libs/libnet.a and /dev/null differ diff --git a/libs/libthrd.a b/libs/libthrd.a deleted file mode 100644 index 5d88785..0000000 Binary files a/libs/libthrd.a and /dev/null differ diff --git a/src/Makefile b/src/Makefile new file mode 100755 index 0000000..ebe5685 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,31 @@ + +CC=gcc +CFLAGS=-W -Wall -Wextra -g +CDIR=../bin/ +LIB=libthrd.a libnet.a +LDIR=../libs/ +LIBS=$(LDIR)libthrd.a $(LDIR)libnet.a +IDIR=../includes/ +LDFLAGS=-lpthread -lpcap + + + +all: sonde serverTCP + +serverTCP: serverTCP.c + $(CC) -o $(CDIR)$@ $< -I$(IDIR) -L$(LDIR) $(LIBS) $(CFLAGS) $(LDFLAGS) + rm -f *.o + + +sonde: sonde.c + $(CC) -o $(CDIR)$@ $< -I$(IDIR) $(LIBS) $(CFLAGS) $(LDFLAGS) + rm -f *.o + +# +# La cible de nettoyage +# + +clean: + rm -f *.o $(CDIR)sonde $(CDIR)serverTCP + + diff --git a/src/serverTCP.c b/src/serverTCP.c new file mode 100644 index 0000000..5d24594 --- /dev/null +++ b/src/serverTCP.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include "libnet.h" +#include + +int sock_fd; + +struct sigaction action; + +void handler(int sig) +{ + if(sig==SIGINT) + { + printf("\nINTERRUPTION SOCKET : %d\n\n", sock_fd); + close(sock_fd); + exit(1); + } +} + + +void argPortParsing(int argc, char* argv[], char* port) +{ + struct option port_arg={"port", 1, NULL, 'p'}; // + char opt; + int longindex; + + while( (opt=getopt_long(argc, argv, "p:", &port_arg, &longindex)) !='p' && opt!=-1) {} + + if(opt=='p') + { + strcpy(port, optarg); //optarg est une variable instanciée dans la librairie getopt + printf("%s\n", optarg); + } + else + { + printf("La syntaxe doit être de la forme %s -p ou %s --port \n\n", argv[0], argv[0]); + } +} + + +int main(int argc, char* argv[]) +{ + + char port[10]="80"; + argPortParsing(argc, argv, port); + + action.sa_handler=&handler; + sigaction(SIGINT, &action, NULL); + + if( (sock_fd=initialisationServeur(port)) ==-1 ) { fprintf(stderr, "Initialisation du serveur impossible\n"); return -1; } + + boucleServeur(sock_fd, (void*)&reponseConnexion); + + return 0; +} + diff --git a/src/sonde.c b/src/sonde.c new file mode 100755 index 0000000..fa75b72 --- /dev/null +++ b/src/sonde.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include "libnet.h" + + +int sock_fd; + +struct sigaction action; + + + +void handler(int sig) +{ + if(sig==SIGINT) + { + printf("\nINTERRUPTION SOCKET : %d\n\n", sock_fd); + close(sock_fd); + exit(1); + } +} + + +void argPortParsing(int argc, char* argv[], char* device) +{ + struct option port_arg={"dev", 1, NULL, 'd'}; + char opt; + int longindex; + + while( (opt=getopt_long(argc, argv, "d:", &port_arg, &longindex)) !='d' && opt!=-1) {} + + if(opt=='d') + { + strcpy(device, optarg); + printf("%s\n", optarg); + } + else + { + strcpy(device, "eth0"); + } +} + + +int main(int argc, char* argv[]) +{ + char device[100]; // On stockera le nom de l'interface + argPortParsing(argc, argv, device); // On vérifie les arguments si il y a + + // On met en place la détection d'interruption + action.sa_handler=&handler; + sigaction(SIGINT, &action, NULL); + + // Fonction d'écoute du réseau + if(ecouteReseau(device)!=0){ return -1;} + + return 0; +} + -- libgit2 0.21.2