Test de programmation réseau dans les conditions d'un TP
(22 décembre 2000 – durée : 2h)
©
M. Laporte -
D. Mathieu laporte@romarin.univ-aix.fr -
C. Pain-Barre
I.U.T.d'Aix en Provence - Département Informatique
Créé le 20/12/2000 - Dernière mise à jour
: 20/01/2001

Tout document autorisé
Remarques préliminaires
Sommaire
Réception
de message urgent par le signal SIGURG
Réception
de message urgent par la fonction select()
Réception
de message urgent par le signal SIGURG
exo_01
-
Liste des fichiers créés ou modifiés : exo_01s.cxx,
exo_01c.cxx
Emission :
Une donnée urgente est en principe constituée
d'un seul octet émis au moyen de la fonction send(), en
utilisant le flag MSG_OOB (définie dans le fichiers
<sys/socket.h>).
Réception :
Une donnée urgente est lue au moyen de la
fonction recv(), en utilisant aussi le flag MSG_OOB.
Sous réserve qu'il soit déclaré propriétaire
de la socket (voir plus loin), le processus consommateur est informé
de l'arrivée d'un message urgent par la réception du signal
SIGURG.
Serveur :
Ecrire un serveur (exo_01s.cxx) qui :
-
crée une socket Internet en mode connecté (machine
hôte et votre numéro de port correspondant à
votre nom de service personnel),affiche le numéro de port du service,
puis,
-
accepte une connexion, enfin
-
dans une boucle infinie, émet un message normal, puis un message
urgent, chacun temporisé par un délai de 1 seconde.
Client :
Ecrire un client (exo_01c.cxx) qui :
-
se connecte sur la socket (nom de la machine et numéro de
port passés en arguments de la commande),
-
se rend propriétaire de la socket (appel de la fonction fcntl(),
avec pour paramètre request la constante F_SETOWN (définie
dans le fichier <fcntl.h>) et pour paramètre argument
la valeur du pid du processus,
-
déroute le signal SIGURG vers une fonction qui lit et affiche
à l'écran le message urgent,
-
dans une boucle infinie, essaie de lire le message normal qu'il
affiche à l'écran.
Corrigés :
exo_01s.cxx
-
exo_01c.cxx
Sommaire
Réception
de message urgent par la fonction select()
exo_02
-
Liste des fichiers créés ou modifiés : exo_02c.cxx
Le système a un autre moyen de prévenir
un processus de l'arrivée d'un message urgent grâce à
la fonction select().
Ecrire un client (exo_02c.cxx) qui :
-
se connecte sur la socket (nom de la machine et numéro de
port passés en arguments de la commande),
-
dans une boucle infinie, lit sur la socket soit un message normal,
soit un message urgent, qsu'il affiche à l'écran. Pour cela,
le descripteur de la socket doit être positionné à
la fois dans le masque de lecture et dans le masque d'exceptions de la
fonction select().
Corrigés :
exo_02c.cxx
Sommaire
Persistance de connexion [1]
Il est possible de perdre temporairement une connexion
entre les deux processus communiquant sur des machines distinctes, sans
que l'application s'en aperçoive. C'est en effet à TCP de
résoudre le problème qui peut rester complètement
transparent pour l'utiliusateur. Il est cependant possible à une
application de tester périodiquement la persistance de la connexion
par un échange régulier de messages urgents :
-
client : périodiquement, il envoie au serveur un message
urgent et le comptabilise. Lorrsque le compteur atteint une valeur fixée
à l'avance (passée en argument de la commande), un booléen
est positionné qui permet de sortir de la boucle "infinie" (stratégie
E). Chaque fois qu'il reçoit en retour un message urgent, il remet
le compteur à 0.
-
serveur : périodiquement, il réarme un timer
et comptabilise les réarmements. Lorsque le compteur atteint une
valeur fixée à l'avance (passée en argument de la
commande), un booléen est positionné qui permet de
sortir de la boucle "infinie" (stratégie E). Chaque fois qu'il
reçoit un message urgent, il le réémet et remet
le compteur à 0.
Dans chacun des deux processus (client et serveur),
et sans altérer leur fonctionnement normal, un événement
périodique peut être obtenu de la façon suivante :
-
en débnut de programme, dérouter le signal correspondant
à la fonction alarm() vers un traitant DeroutAlarm(),
-
au moyen de la foction alarm(), armer un timer à
une valeur passée en argument de la commande,
-
terminer la fonction DeroutAlarm() en réarmant le timer.
Serveur :
Recopier le fichier exo_01s.cxx dans exo_03s.cxx.
Dans l'espace de noms anonyme, ajouter les traitants de signaux en provenance
de l'alarme et des messages urgents.
Dans la fonction ppal() :
-
dérouter les deux signaux vers leur traitant, puis
-
initialiser le compteur d'événements,
-
après obtention de la socket de communication, s'en rendre
propriétaire comme dans l'exo_01,
-
dans une boucle infnie, émettre un message temporisé par
un délai de 3 secondes.
Client :
Recopier le fichier exo_01c.cxx dans exo_03c.cxx.
Dans l'espace de noms anonyme, ajouter les traintants des signaux en provenance
de l'alarme et des messages urgents (attention, ils sont légèrement
différents des traitants de signaux du serveur : voir plus haut).
Dans la fonction ppal() :
-
dérouter les deux signaux vers leur traitant, puis
-
initialiser le compteur d'événements,
-
après obtention de la socket de communication, s'en rendre
propriétaire comme dans l'exo_01,
-
dans une boucle infnie, recevoir un message normal et l'afficher à
l'écran
.Corrigés : exo_03s.cxx
- exo_03c.cxx
Sommaire
[1] Très fortement inspiré de : W.R.
Stevens, "Unix Network programming", Prentice hall, 1998