Programmation Système et Réseau
TP n° 5




Notions abordées :


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.