Test de rattrapage Réseau : Partie I

(10 mars 2001 – durée : 2h)
M. Laporte - D. Mathieu - C. Pain-Barre
I.U.T. d'Aix en Provence - Département Informatique

Tout document autorisé

Remarques préliminaires :

Sommaire

Introduction
Serveur_connecté_concurrent_monoprocessus
Client connecté
Envoi et réception de la liste des clients effectifs


Introduction

     Dans ce qui va suivre, on suppose que l’on dispose d’un réseau ne permettant pas la multidiffusion matérielle. C’est un réseau point à point structuré en étoile c’est à dire qu’il y a une machine hôte placée au centre de la structure à laquelle sont reliées toutes les autres. Celles-ci ne sont pas reliées entre-elles et ne peuvent donc communiquer qu’avec l'hôte central.

Objectif : service d’acheminement de messages

     Le but de cet exercice est d’utiliser cette étoile pour simuler un bus par logiciel, en utilisant une structure client-serveur.

     Tout client référencé pourra parler à tout autre client référencé et la multidiffusion sera aussi possible. Pour cela, il faut réaliser un serveur qui devra acheminer tout message en provenance d’un client i et à destination d’un client j ou de tous les clients.

    Tout client désireux d’envoyer ou de recevoir des messages doit :

    Puis, pour émettre un message à destination d’un client quelconque, il doit demander le service au serveur en lui envoyant un message contenant dans l'ordre les éléments suivants : En théorie, le bus formé peut contenir 65536 clients mais deux numéros ont un rôle particulier et sont réservés : Gestion de la connexion d'un client

Le serveur doit gérer la table TabClients référençant chaque client, et définie comme suit :
 
namespace
{
    struct SClient
    {
        bool EstConnecte;
        char Pseudo [9];

    }; // SClient

    enum {CstMaxBus = 65534}; 

    SClient TabClients [CstMaxBus];

} // namespace anonyme

    Le serveur attribue à tout client qui se connecte un élément de cette table dont l'indice est calculé par sdComm - sdConnectsdComm est le résultat de la fonction accept(), et sdConnect est le socket descriptor de la socket de connexion. Cet indice correspond au "numéro de client".

    Le champ EstConnecte est mis à vrai dès que le client se connecte, mais celui-ci ne fait effectivement partie de la liste que lorsque le serveur a reçu son pseudo et a renseigné la donnée membre Pseudo. Un tel client est appelé un client effectif.

    Le serveur envoie cette liste à tous les clients effectifs dans l'un des deux cas suivants :

Message en provenance d'un client

    Lorsque le serveur reçoit un message en provenance d'un client, il examine sa destination : Remarque : tous les objets globaux utilisés devront être déclarés dans l'espace de noms anonyme.


Serveur connecté concurrent monoprocessus

    Ecrire une fonction ppal() qui contient la modélisation d'un serveur connecté concurrent monoprocessus qui :     Les fonctions InitClients(), TraiterInfoDuClient(), TraiterConnexion() mettent à jour la variable Mask nécessaire pour utiliser la fonction Select().

Remarque : les fonctions InitClients(), TraiterInfoDuClient() et TraiterConnexion()  ne sont pas à écrire pour le moment.

Corrigés : exo_01s.cxx

Sommaire


Client connecté

    Ecrire une fonction ppal() qui :     A nouveau, les fonctions TraiterClavier() et TraiterInfoDuServeur() ne sont pas encore à écrire.

[1] "signaler" veut dire indiquer au serveur qu'il ne lui enverra plus de message.

Corrigés : exo_01c.cxx

Sommaire


Envoi et réception de la liste des clients effectifs

Envoi de la liste des clients par le serveur

    Dans l'espace de noms anonyme, écrire la fonction de prototype :
 
void EnvoyerListe (int sd);

qui est appelée par le serveur lorsqu'il doit envoyer la liste des clients effectifs au client connecté à la socket sd. Cette fonction :

Réception de la liste des clients effectifs par le client

       Dans l'espace de noms anonyme, écrire la fonction de prototype :
 
void RecevoirListe (int sd);

qui est appelée par le client lorsqu'il a reçu l'annonce du début de liste, et qui affiche les informations recueillies.

Sommaire

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