©
M. Laporte - D. Mathieu
mathieu@romarin.univ-aix.fr
- C. Pain-Barre
I.U.T.d'Aix en Provence - Département Informatique
Tout document autorisé
Remarque préliminaire :
Lorsque le client et le serveur sont localisés sur la même machine, il est plus efficace de les faire communiquer dans le domaine local (Unix, bien sûr) plutôt que par l'intermédiaire d'un protocole Internet (TCP ou UDP). C'est cet aspect qui est mis en oeuvre dans ces exercices.
int CharGen (int sd) throw (CExcFctSystFile); |
qui :
Pour être plus proche du service universel chargen du démon inetd, la fonction CharGen() devrait générer un service aléatoire : nombre aléatoire (entre 1 et CstMaxMessages) de messages envoyés avant la déconnexion, nombre aléatoire (entre 1 et MaxLongueur) de caractères aléatoires éditables (entre ' ' et 'z') du message. Cependant, cela n'apporterait rien dans le cadre d'un test réseau et n'est donc pas demandé.
En revanche une dernière modification peut
être utile : la longueur maximale des trames (messages) envoyées
sur la
socket dépend de la nature du domaine. En local, où
les échanges se font directement par la mémoire, la taille
des trames peut être assez grande (par exemple une page mémoire,
ou 4096 octets). Au contraire, dans le domaine Internet qui utilise
IP, on peut limiter les messages à 512 octets par exemple.
Le processus esclave doit donc déterminer quel est le domaine d'adressage
(AF_LOCAL ou AF_INET) de la socket de communication
sdComm
qu'il reçoit en paramètre. Il lui suffit d'utiliser la fonction
système ::getsockname()
(sans tester la valeur de retour,
EXCEPTIONNELLEMENT !) utilisée en TP, qui remplit la zone pointée
par le second paramètre
address avec une structure sockaddr_un
ou sockaddr_in selon le descripteur. Il faut donc que la zone
réceptrice soit assez grande pour recevoir le résultat de
l'un ou l'autre type. Vous pouvez par exemple utiliser une structure que
vous déclarerez ainsi :
struct sockaddr_bidon
{ unsigned short af_family; char bidon [108]; }; |
Modifier le serveur pour qu'il envoie un certain nombre de fois (ce que vous voudrez) une chaîne, différente selon qu'il utilise une socket locale ou internet.
Corrigés : exo_02s.cxx
Client : le client boucle jusqu'à ce que quelque chose soit saisi au clavier (cette saisie est un événement détectable dans un masque de lecture de la fonction select())., auquel cas il ferme la socket de communication en écriture, vide les caractères restants et se termine normalement.
Serveur : le serveur boucle jusqu'à ce que la socket de communication soit fermée en lecture (cette fermeture est un événement détectable dans un masque de lecture de la fonction select()).
Indiquer seulement les modifications à effectuer dans chacun des fichiers.
Corrigés : exo_03s.cxx - exo_03c.cxx
© D. Mathieu
mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique