[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.
* É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)
/* 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 <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 ;
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 ;
}