From e0d3e07e1113b7eda35855bf16d64a6836c1c1be Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Thu, 2 Jul 2009 18:48:32 +0000 Subject: [PATCH] [Client] Ajout d'options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit client : * Ajout de l'option -l permettant d'activer ou non l'attente d'une réponse après l'envoi d'une demande, et éventuellement de spécifier un port alternatif. * Ajout de l'option -p permettant de spécifier le port d'envoi des demandes. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@100 785a6c6c-259e-4ff1-8b91-dc31627914f0 --- infrastructure-centred/owlps-client/TODO | 2 - .../owlps-client/owlps-client.c | 86 ++++++++++++++----- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/infrastructure-centred/owlps-client/TODO b/infrastructure-centred/owlps-client/TODO index 6d5b14b..d5a106a 100644 --- a/infrastructure-centred/owlps-client/TODO +++ b/infrastructure-centred/owlps-client/TODO @@ -1,4 +1,2 @@ * Vérifier que la direction est bien une des quatre possibles. * Éventuellement, permettre l'utilisation d'une chaîne de caractères pour la direction. -* Permettre de choisir soi-même le port d'envoi des demandes, au lieu d'utiliser LOC_REQUEST_DEFAULT_PORT. -* Ajout d'une option et/ou d'une option préprocesseur (#ifdef WAIT_FOR_POSITION) permettant d'activer ou non l'attente d'une réponse après l'envoi d'une demande. diff --git a/infrastructure-centred/owlps-client/owlps-client.c b/infrastructure-centred/owlps-client/owlps-client.c index 941a2f9..036d33b 100644 --- a/infrastructure-centred/owlps-client/owlps-client.c +++ b/infrastructure-centred/owlps-client/owlps-client.c @@ -20,20 +20,23 @@ #define DEFAULT_DELAY_NORMAL 25000 // Délai entre chaque émission de paquet dans le cas d'une demande de localisation (en microsecondes) /* Arguments du programme */ -#define OPTIONS "d:i:t:n:" +#define OPTIONS "d:i:l::n:p:t:" + /* Affiche le mode d'emploi du programme */ void print_usage(char *prog) { printf("Usage :\n\ -\t- Demande de localisation : %s -d destination_ip [-i iface] [-t delay] [-n nb_packets]\n\ -\t- Requête de calibration : %s -d destination_ip [-i iface] [-t delay] [-n nb_packets] direction x y z\n\ -destination_ip est l'adresse IP vers laquelle sera envoyée la demande de localisation.\n\ -delay est le délai d'attente entre chaque paquet émis.\n\ -nb_packets est le nombre de paquets émis pour la demande.\n\ -iface est une chaîne désignant le nom de interface réseau à partir de laquelle envoyer la demande (par exemple \"eth2\"). Si elle n'est pas spécifiée, le choix de l'interface source est automatique. Vous devez être root pour utiliser cette option.\n\ -", prog, prog) ; +\t- Demande de localisation : %s -d dest_ip [-p dest_port] [-i iface] [-t delay] [-n nb_packets] [-l [port]]\n\ +\t- Requête de calibration : %s -d dest_ip [-i iface] [-t delay] [-n nb_packets] direction x y z\n\ +- dest_ip est l'adresse IP vers laquelle sera envoyée la demande de localisation.\n\ +- dest_port est le port sur lequel sera envoyée la demande de localisation (défaut : %d).\n\ +- delay est le délai d'attente entre chaque paquet émis.\n\ +- nb_packets est le nombre de paquets émis pour la demande.\n\ +- iface est une chaîne désignant le nom de interface réseau à partir de laquelle envoyer la demande (par exemple \"eth2\"). Si elle n'est pas spécifiée, le choix de l'interface source est automatique. Vous devez être root pour utiliser cette option.\n\ +- L'option -l indique au programme qu'il doit attendre et afficher la position calculée par l'infrastructure avant de quitter. L'argument optionnel \"port\" permet de spécifier le port d'écoute ; s'il n'est pas présent, la valeur par défaut (%d) est utilisée.\n\ +", prog, prog, LOC_REQUEST_DEFAULT_PORT, MOBILE_DEFAULT_PORT) ; } @@ -54,22 +57,29 @@ int main(int argc, char *argv[]) struct { char dest_ip[16] ; // Adresse IP de destination des paquets de la demande + long dest_port ; char iface[IFNAMSIZ + 1] ; // Interface réseau depuis laquelle on envoit les paquets long delay ; // Temps d'attente entre chaque émission de paquet short nb_pkt ; // Nombre de paquets envoyés pour la demande + long listening_port ; // Données de calibration : DIRECTION direction ; float x ; float y ; float z ; - } options = {"", "", -1, -1, 0, 0, 0, 0} ; + } options = {"", + LOC_REQUEST_DEFAULT_PORT, + "", + -1, + -1, + -1, + 0, 0, 0, 0 + } ; int opt ; // Retour de getopt - float x,y,z; // Position reçue en réponse du serveur + float x, y, z ; // Position reçue en réponse du serveur - // int delay = (argc == ARGC_NORMAL ? DELAY_NORMAL : DELAY_CALIB) ; - /* Parcours des arguments de la ligne de commandes */ while ((opt = getopt(argc, argv, OPTIONS)) != -1) { @@ -81,12 +91,30 @@ int main(int argc, char *argv[]) case 'i' : strncpy(options.iface, optarg, IFNAMSIZ + 1) ; break ; - case 't' : - options.delay = strtol(optarg, NULL, 0) ; + case 'l' : + if (optarg == 0) // Les options facultatives de getopt ne gèrent pas + { // les valeurs séparées (du type : -l ) + if (argv[optind] == NULL // Si on est en bout de chaîne ou que l'optind + || argv[optind][0] == '-') // suivant est une option, c'est qu'on a -l sans numéro de port + options.listening_port = MOBILE_DEFAULT_PORT ; // on prend donc la valeur par défaut. + else + { // Sinon on prend la valeur de l'optind : + options.listening_port = strtol(argv[optind], NULL, 0) ; + optind++ ; + } + } + else // On a une option de la forme -l, tout va bien + options.listening_port = strtol(optarg, NULL, 0) ; break ; case 'n' : options.nb_pkt = strtol(optarg, NULL, 0) ; break ; + case 'p' : + options.dest_port = strtol(optarg, NULL, 0) ; + break ; + case 't' : + options.delay = strtol(optarg, NULL, 0) ; + break ; default : print_usage(argv[0]) ; return ERR_BAD_USAGE ; @@ -139,21 +167,32 @@ int main(int argc, char *argv[]) else options.nb_pkt = DEFAULT_NBPKT_NORMAL ; } + if (is_calibration_request && options.listening_port != -1) + { +#ifdef DEBUG + fprintf(stderr, "Attention ! Vous ne pouvez pas attendre de réponse du serveur lorsque vous effectuez une requête de calibration. Option -l ignorée...\n") ; +#endif // DEBUG + options.listening_port = -1 ; + } #ifdef DEBUG fprintf(stderr, "Options :\n\ -\tDestination : %s\n\ +\tDestination IP : %s\n\ +\tDestination port : %ld\n\ \tInterface : %s\n\ \tDelay : %ld\n\ \tNumber of packets : %d\n\ +\tListening port : %ld\n\ \tDirection : %d\n\ \tX : %f\n\ \tY : %f\n\ \tZ : %f\n", options.dest_ip, + options.dest_port, options.iface, options.delay, options.nb_pkt, + options.listening_port, options.direction, options.x, options.y, @@ -162,7 +201,7 @@ int main(int argc, char *argv[]) #endif // DEBUG /* Ouverture de la socket UDP vers le serveur d'aggrégation */ - sockfd = create_udp_sending_socket(options.dest_ip, LOC_REQUEST_DEFAULT_PORT, &server, &client) ; + sockfd = create_udp_sending_socket(options.dest_ip, options.dest_port, &server, &client) ; if (sockfd < 0) { perror("Erreur ! Impossible de créer la socket vers le serveur d'aggrégation \n"); @@ -257,12 +296,15 @@ int main(int argc, char *argv[]) (void) close(sockfd) ; /* Attente de la position du serveur */ - sockfd = create_udp_listening_socket(MOBILE_DEFAULT_PORT); - recvfrom(sockfd, &x, sizeof(float), 0, NULL, NULL); - recvfrom(sockfd, &y, sizeof(float), 0, NULL, NULL); - recvfrom(sockfd, &z, sizeof(float), 0, NULL, NULL); - (void) close(sockfd) ; - printf("Position reçue : (%.4f;%.4f;%.4f)\n", x, y, z); + if (options.listening_port != -1) + { + sockfd = create_udp_listening_socket(options.listening_port); + recvfrom(sockfd, &x, sizeof(float), 0, NULL, NULL); + recvfrom(sockfd, &y, sizeof(float), 0, NULL, NULL); + recvfrom(sockfd, &z, sizeof(float), 0, NULL, NULL); + (void) close(sockfd) ; + printf("Position reçue : (%.4f;%.4f;%.4f)\n", x, y, z); + } return 0 ; }