[Client] Ajout d'options

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
This commit is contained in:
Matteo Cypriani 2009-07-02 18:48:32 +00:00
parent bb51f59328
commit e0d3e07e11
2 changed files with 64 additions and 24 deletions

View File

@ -1,4 +1,2 @@
* Vérifier que la direction est bien une des quatre possibles. * 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. * É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.

View File

@ -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) #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 */ /* Arguments du programme */
#define OPTIONS "d:i:t:n:" #define OPTIONS "d:i:l::n:p:t:"
/* Affiche le mode d'emploi du programme */ /* Affiche le mode d'emploi du programme */
void print_usage(char *prog) void print_usage(char *prog)
{ {
printf("Usage :\n\ printf("Usage :\n\
\t- Demande de localisation : %s -d destination_ip [-i iface] [-t delay] [-n nb_packets]\n\ \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 destination_ip [-i iface] [-t delay] [-n nb_packets] direction x y z\n\ \t- Requête de calibration : %s -d dest_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\ - dest_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\ - dest_port est le port sur lequel sera envoyée la demande de localisation (défaut : %d).\n\
nb_packets est le nombre de paquets émis pour la demande.\n\ - delay est le délai d'attente entre chaque paquet émis.\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\ - nb_packets est le nombre de paquets émis pour la demande.\n\
", prog, prog) ; - 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 { struct {
char dest_ip[16] ; // Adresse IP de destination des paquets de la demande 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 char iface[IFNAMSIZ + 1] ; // Interface réseau depuis laquelle on envoit les paquets
long delay ; // Temps d'attente entre chaque émission de paquet long delay ; // Temps d'attente entre chaque émission de paquet
short nb_pkt ; // Nombre de paquets envoyés pour la demande short nb_pkt ; // Nombre de paquets envoyés pour la demande
long listening_port ;
// Données de calibration : // Données de calibration :
DIRECTION direction ; DIRECTION direction ;
float x ; float x ;
float y ; float y ;
float z ; 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 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 */ /* Parcours des arguments de la ligne de commandes */
while ((opt = getopt(argc, argv, OPTIONS)) != -1) while ((opt = getopt(argc, argv, OPTIONS)) != -1)
{ {
@ -81,12 +91,30 @@ int main(int argc, char *argv[])
case 'i' : case 'i' :
strncpy(options.iface, optarg, IFNAMSIZ + 1) ; strncpy(options.iface, optarg, IFNAMSIZ + 1) ;
break ; break ;
case 't' : case 'l' :
options.delay = strtol(optarg, NULL, 0) ; if (optarg == 0) // Les options facultatives de getopt ne gèrent pas
{ // les valeurs séparées (du type : -l <port>)
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<port>, tout va bien
options.listening_port = strtol(optarg, NULL, 0) ;
break ; break ;
case 'n' : case 'n' :
options.nb_pkt = strtol(optarg, NULL, 0) ; options.nb_pkt = strtol(optarg, NULL, 0) ;
break ; break ;
case 'p' :
options.dest_port = strtol(optarg, NULL, 0) ;
break ;
case 't' :
options.delay = strtol(optarg, NULL, 0) ;
break ;
default : default :
print_usage(argv[0]) ; print_usage(argv[0]) ;
return ERR_BAD_USAGE ; return ERR_BAD_USAGE ;
@ -139,21 +167,32 @@ int main(int argc, char *argv[])
else else
options.nb_pkt = DEFAULT_NBPKT_NORMAL ; 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 #ifdef DEBUG
fprintf(stderr, "Options :\n\ fprintf(stderr, "Options :\n\
\tDestination : %s\n\ \tDestination IP : %s\n\
\tDestination port : %ld\n\
\tInterface : %s\n\ \tInterface : %s\n\
\tDelay : %ld\n\ \tDelay : %ld\n\
\tNumber of packets : %d\n\ \tNumber of packets : %d\n\
\tListening port : %ld\n\
\tDirection : %d\n\ \tDirection : %d\n\
\tX : %f\n\ \tX : %f\n\
\tY : %f\n\ \tY : %f\n\
\tZ : %f\n", \tZ : %f\n",
options.dest_ip, options.dest_ip,
options.dest_port,
options.iface, options.iface,
options.delay, options.delay,
options.nb_pkt, options.nb_pkt,
options.listening_port,
options.direction, options.direction,
options.x, options.x,
options.y, options.y,
@ -162,7 +201,7 @@ int main(int argc, char *argv[])
#endif // DEBUG #endif // DEBUG
/* Ouverture de la socket UDP vers le serveur d'aggrégation */ /* 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) if (sockfd < 0)
{ {
perror("Erreur ! Impossible de créer la socket vers le serveur d'aggrégation \n"); 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) ; (void) close(sockfd) ;
/* Attente de la position du serveur */ /* Attente de la position du serveur */
sockfd = create_udp_listening_socket(MOBILE_DEFAULT_PORT); if (options.listening_port != -1)
recvfrom(sockfd, &x, sizeof(float), 0, NULL, NULL); {
recvfrom(sockfd, &y, sizeof(float), 0, NULL, NULL); sockfd = create_udp_listening_socket(options.listening_port);
recvfrom(sockfd, &z, sizeof(float), 0, NULL, NULL); recvfrom(sockfd, &x, sizeof(float), 0, NULL, NULL);
(void) close(sockfd) ; recvfrom(sockfd, &y, sizeof(float), 0, NULL, NULL);
printf("Position reçue : (%.4f;%.4f;%.4f)\n", x, y, z); recvfrom(sockfd, &z, sizeof(float), 0, NULL, NULL);
(void) close(sockfd) ;
printf("Position reçue : (%.4f;%.4f;%.4f)\n", x, y, z);
}
return 0 ; return 0 ;
} }