Test de Réseau - Partie I

(26 janvier 2001 - Durée : 2h)

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

Sommaire

Serveur connecté itératif
Client connecté
Serveur connecté concurrent
Fin de connexion du client

Serveur connecté itératif

    Dans l'espace de noms anonyme, écrire la fonction CharGen() de profil suivant :
 
int CharGen (int sd) throw (CExcFctSystFile);

qui :

    Ecrire la fonction ppal() d'un serveur qui offre deux sockets de connexion :     Puis, dans une boucle infinie, le serveur : Corrigés : exo_01s.cxx

Sommaire


Client connecté

    Le client effectue les opérations suivantes : Corrigés : exo_01c.cxx

Sommaire


Serveur connecté concurrent

    Indiquer les modifications à faire dans la fonction ppal() du serveur pour le transformer en serveur concurrent "propre" (création d'un processus esclave et fermeture des descripteurs inutiles).

    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

Sommaire


Fin de connexion du client

    Il n'est pas naturel que ce soit le serveur qui ait l'initiative de la terminaison du service chargen (comme echo), mais il doit au contraire envoyer des caractères jusqu'à ce que le client décide de se terminer. Les deux processus doivent être modifiés :

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

Sommaire

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique