[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.