[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:
parent
bb51f59328
commit
e0d3e07e11
|
@ -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.
|
||||
|
|
|
@ -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 ;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue