/* * This file is part of the rtap localisation project. */ #include "rtaputil.h" BOOL run = TRUE ; /* Convertit une adresse MAC en octets en une chaîne de caractères. * ¡ Il est nécessaire de libérer manuellement le retour de cette fonction ! */ char* mac_bytes_to_string(unsigned char *mac_binary) { char *ret = malloc(sizeof(char) * 18) ; sprintf(ret, "%02x:%02x:%02x:%02x:%02x:%02x", mac_binary[0], mac_binary[1], mac_binary[2], mac_binary[3], mac_binary[4], mac_binary[5]) ; ret[17] = '\0' ; return ret ; } /* Convertit un identifiant de canal en son numéro (0 si la fréquence est erronée) */ char frequency_to_channel(unsigned short channel) { char c = 0 ; // Résultat switch (channel) { case 2412 : c = 1 ; break ; case 2417 : c = 2 ; break ; case 2422 : c = 3 ; break ; case 2427 : c = 4 ; break ; case 2432 : c = 5 ; break ; case 2437 : c = 6 ; break ; case 2442 : c = 7 ; break ; case 2447 : c = 8 ; break ; case 2452 : c = 9 ; break ; case 2457 : c = 10 ; break ; case 2462 : c = 11 ; break ; case 2467 : c = 12 ; break ; case 2472 : c = 13 ; break ; case 2477 : c = 14 ; break ; } return c ; } /* Retourne une date au format struct timeval en mili-secondes */ unsigned long timeval_to_ms(struct timeval d) { return d.tv_sec * 1000 + d.tv_usec / 1000 ; } /* Retourne le temps (en millisecondes) écoulé entre deux dates */ unsigned long sub_date(struct timeval sup, struct timeval inf) { unsigned long sup_ms = sup.tv_sec * 1000 + sup.tv_usec / 1000 ; unsigned long inf_ms = inf.tv_sec * 1000 + inf.tv_usec / 1000 ; return abs(sup_ms - inf_ms) ; } /* Compare deux adresses MAC : retourne TRUE si elles sont égales, FALSE sinon */ BOOL mac_cmp(unsigned char *mac1, unsigned char *mac2) { int i ; for(i=0 ; i < 6 ; i++) if(mac1[i] != mac2[i]) return FALSE ; return TRUE ; } /* Crée une socket d'envoi UDP et retourne son descripteur. * Paramètres : * - server_address : l'adresse IP du serveur. * - server_port : le port d'écoute du serveur. * - server_description (paramètre résultat) : la structure dans laquelle sera enregistrée la description du serveur. * - client_description (paramètre résultat) : la structure dans laquelle sera enregistrée la description du client. */ int create_udp_sending_socket(char *server_address, int server_port, struct sockaddr_in *server_description, struct sockaddr_in * client_description) { int sockfd ; // Descripteur de la socket /* Ceation de la socket UDP */ sockfd = socket(AF_INET, SOCK_DGRAM, 0) ; if (sockfd < 0) { perror("Échec de la création de la socket ") ; return(sockfd) ; } /* Remise à zéro et initialisation de la structure du client */ bzero((char *) client_description, sizeof(*client_description)) ; client_description->sin_family = AF_INET ; // Socket INET client_description->sin_addr.s_addr = htonl(INADDR_ANY) ; // Toutes les connexions // client_description->sin_port = htons(0) ; // N'importe quel port (ne sert à rien a priori) /* Remise à zéro et initialisation de la structure du serveur */ bzero((char *) server_description, sizeof(*server_description)) ; // RÀZ server_description->sin_family = AF_INET ; // Socket INET server_description->sin_addr.s_addr = inet_addr(server_address) ; // Adresse du serveur server_description->sin_port = htons(server_port) ; // Port d'écoute du serveur return (sockfd) ; // On retourne le descripteur de la socket créée } /* Crée une socket d'écoute UDP et retourne son descripteur. * Paramètres : * - port est le port sur lequel écouter. */ int create_udp_listening_socket(int port) { int sockfd ; // Descripteur de la socket struct sockaddr_in server_description ; // Structure du serveur int ret = 0 ; // Valeur de retour /* Création d'une socket UDP */ sockfd = socket(AF_INET, SOCK_DGRAM, 0) ; if (sockfd < 0) { perror("Échec de la création de la socket ") ; return(sockfd) ; } /* Remise à zéro et initialisation de la structure du serveur */ bzero((char *) &server_description, sizeof(server_description)) ; // RÀZ server_description.sin_family = AF_INET ; // Socket INET server_description.sin_addr.s_addr = htonl(INADDR_ANY) ; // Toutes les connexions sont acceptées server_description.sin_port = htons(port) ; // Port d'écoute /* Réservation du port */ ret = bind(sockfd, (struct sockaddr*) &server_description, sizeof(server_description)) ; if (ret < 0) { perror("Impossible de créer la socket (bind) ") ; (void) close(sockfd) ; return ret ; } return sockfd ; // On retourne le descripteur de la socket créée } void sigint_handler(int num) { if (num != SIGINT) { fprintf(stderr, "Erreur ! Gestionnaire de SIGINT appelé mais le signal n'est pas SIGINT.\n") ; exit(1) ; } run = FALSE ; printf("\nSignal reçu : fin du programme.\n"); fflush(NULL) ; } void sigterm_handler(int num) { if (num != SIGTERM) { fprintf(stderr, "Erreur ! Gestionnaire de SIGTERM appelé mais le signal n'est pas SIGINT.\n") ; exit(1) ; } sigint_handler(SIGINT) ; }