Exercice 1.
Expliquer le fonctionnement du programme suivant :
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
main(int argc, char *argv[])
{
struct addrinfo hints;
struct addrinfo *resultat;
char stradr[INET_ADDRSTRLEN];
if(argc!=2)
{
fprintf(stderr,"usage: %s
<host>\n", argv[0]);
exit(1);
}
memset(&hints,0,sizeof hints); /* remplit la structure de 0
*/
hints.ai_socktype = SOCK_DGRAM; /* UDP */
hints.ai_family = AF_INET; /* IPv4 */
if(getaddrinfo(argv[1],NULL,&hints,&resultat))
{
fprintf(stderr,"erreur getaddrinfo\n");
exit(1);
}
inet_ntop(AF_INET,&((struct sockaddr_in
*)resultat->ai_addr)->sin_addr, stradr, INET_ADDRSTRLEN);
printf("%s\n",stradr);
freeaddrinfo(resultat);
exit(0);
}
Exercice 2.
Ecrire
à l'aide du protocole UDP un émetteur et un
récepteur. L'émetteur envoie une chaine de
caractères au récepteur. (voir les squelettes
téléchargeables des programmes C pour l'
émetteur
et
le
récepteur.)
Le
fichier
emetteur.c contient un squelette en C de l'émetteur
UDP qui envoie une chaîne de caractères à l’adresse
IPv4 et au numéro de port spécifiés sur la ligne
de commande au lancement du programmme. De même, le fichier
recepteur.c contient un squelette en C du recepteur UDP qui
réceptionne une chaîne de caractères et l’affiche
à l’écran. Le numéro de port utilisé par le
recepteur doit être passé en paramètre au lancement
du programme.
Il s'agit :
- d'ajouter le code manquant dans les fichiers emetteur.c et
recepteur.c pour qu’ils soient fonctionnels (includes,
paramètres des fonctions, etc.).
- après avoir compilé les deux programmes, de lancer le
récepteur (recepteur) puis l’émetteur (emetteur) avec les
bons paramètres et vérifiez que la chaîne
envoyée par l’émetteur est correctement affichée
du côté du récepteur.
Exercice 3.
Même
chose qu'à l'exercice 2, mais avec un nombre plutôt qu'une
chaîne de caractères. Tester votre application
en plaçant l'émetteur et le recepteur sur des machines
différentes (codd et turing).
Exercice 4.
Ecrire 2
programmes à l'aide du protocole UDP : un client et un
serveur qui s'échangent des nombres. Les 2 programmes sont
à la fois emetteur et recepteur : Le client envoie un nombre au
serveur qui lui renvoie ce nombre élevé au carré.
Exemple d'exécution (le client est sur turing et reçoit
sur le port 10000 et le serveur est sur codd et reçoit sur le
port 10001) :
côté client (sur turing) :
$ ./client
10000 codd 10001 12
J'envoie 12 au
serveur
Le serveur m'a
renvoyé 144
$
côté serveur (sur codd) :
$ ./serveur
10001
J'ai reçu 12
du client
J'envoie 144 au client
$
Exercice 5.
(Jeu "deviner un nombre".) Réaliser le jeu "deviner un nombre"
en utilisant le schéma client/serveur. Le serveur choisit un
nombre au hasard entre 1 et 1000 et chaque client essaie de le deviner.
Chaque client propose un nombre au serveur (le nombre est donné
sur la ligne de commande). Si le nombre n'est pas celui du serveur,
alors le serveur répond au client en précisant le nombre
total d'essais, et si le nombre proposé est trop petit ou trop
grand. Si le nombre est celui du serveur, alors le serveur avertit le
client et termine.
Exemple d'exécution (le client est sur turing et reçoit
sur le port 10000 et le serveur est sur codd et reçoit sur le
port 10001) :
côté client (sur turing) :
$ ./client 10000
codd 10001 50
essai n°1 : 50 est trop grand.
$ ./client 10000 codd 10001 5
essai n°2 : 5 est trop petit.
$ ./client 10000 codd 10001 45
essai n°3 : c'est bien 45 !
côté serveur (sur codd) :
$ ./serveur
10001
J'ai choisi un
nombre ...
On vient de le
deviner.