[t]40ex
UniversitéPierre & Marie Curie
U.F.R d'infomatique
[t]45ex
Maîtrise -- 2000-01
Programmation Objet et Distribution



Tavaux dirigés n° 6

Principe d'un serveur :
1. Créer une socket s
2. Lier s
3. Se mettre en écoute
4. Faire
5.   Accepter une connexion sur s :
      on obtient un descripteur de fichier cf
      et une socket de service cs
6.   Créer un processus pour traiter la connexion 
7.   Fermer cf
8. Jusqu'àjamais



Exercice I Quelques << internèteries >>


Question (I.1) Écrire une fonction hostname de type Unix.inet_addr -> string qui retourne le nom (s'il est connu) de la machine dont l'adresse IP est passée en argument.


Question (I.2) Écrire une fonction hostaddr de type string -> Unix.inet_addr qui réalise l'opération inverse.


Question (I.3) Écrire une fonction my_inet_addr de type unit -> Unix.inet_addr qui donne l'adresse IP de la machine locale.




Exercice II Le service "Hello" : àchaque connexion d'un client, le serveur renvoie au client une chaîne de caractères de la forme :
Hello nom.machine.client (adresse.machine.client)

Le client se connecte, attend la chaîne de réponse du serveur et l'affiche.


Question (II.1) Pour le serveur : écrire une fonction message de type Unix.sockaddr -> string qui retourne une chaîne de caractère de la forme : Hello nom.machine (adresse.machine).


Question (II.2) Pour le serveur : écrire une fonction hello_server de type int -> unit oùl'argument est un numéro de port. Cette fonction initialise le service puis lance la boucle d'attente de connexion des client pour le service Hello.
On utilisera les fonctions Unix.socket, Unix.bind, Unix.listen, Unix.accept et Unix.fork.
Dés réception d'une connexion, le serveur créera un processus (lourd) pour traiter le client.


Question (II.3) Écrire le programme principal du serveur qui récupère le numéro de port sur la ligne de commande et lance la fonction hello_server.


Question (II.4) Écrire le client qui se connecte, attend la réponse du serveur et l'affiche. Le nom du serveur et le numéro de port du service seront lus sur la ligne de commande.
On utilisera les fonctions Unix.socket et Unix.connect.




Exercice III Client-serveur et processus légers. Le service Ping-Pong : àla réception d'une connexion, le serveur crée une processus léger qui attend que le client lui envoie "Ping" et lui répond "Pong".

Le client se connecte, envoie "Ping" et attend "Pong" pendant un << certain temps >>.


Question (III.1) Écrire la fonction de service en utilisant les entrées-sorties non bloquantes du module ThreadUnix.


Question (III.2) Écrire le programme principal du serveur. On utilisera ici les primitives de ThreadUnix et on lancera un processus léger pour traiter le client. On utilisera également la fonction de haut niveau establish_server.


Question (III.3) Écrire le client. Le module ThreadUnix contient des entrées-sorties temporisées. On utilisera la fonction de haut niveau open_connection.




Exercice IV Un service un peu plus compliqué : la machine àcafè.

On ne s'intéresse ici qu'àla fonction de service que l'on pourra tester en utilisant telnet.


Question (IV.1) Reprendre l'architecture du serveur de la question précédente en modifiant la fonction de service. Pour simplifier, on utilisera les fonctions d'entrées-sorties standard : output_string et input_line.

La fonction de service << machine àcafé >> est décrite par l'automate suivant :





Exercice V Un peu de conception.


Question (V.1) On suppose que l'on dispose sur le réseau d'un certain nombre de serveurs de calcul. Imaginez et décrivez un programme qui, étant donnéun ensemble de calculs àeffectuer les répartit sur différentes machines, attend les résultat et applique un traitement donnéàcet ensemble de résultats.




This document was translated from LATEX by HEVEA.