Laboratoire 11 - Sockets et multiplexage
Sommaire
Objectif: utiliser les sockets du domaine Unix (AF_UNIX
et SOCK_STREAM
) et le multiplexage d’entrée-sorties.
Remarque: n’oubliez pas, lors de l’utilisation d’appels système, de traiter les cas d’erreur.
Écho
- Développez un serveur simple
srv_echo.c
qui accepte les clients et leur renvoie tel quel et directement ce qu’ils envoient.- Le serveur traite entièrement chaque client l’un après l’autre.
- Le serveur reçoit et envoie au fur et à mesure : n’attendez pas de recevoir tous les octets avant de commencer à envoyer.
- Le serveur passe au client suivant quand le client courant a terminé la connexion.
- Développez un client simple
cli.c
qui attend une ligne de l’entrée standard (avecfgets(3)
), l’envoie au serveur, attend la réponse, l’affiche à l’écran, lit la ligne suivante, etc. jusqu’à la fin de l’entrée standard. - Modifiez le serveur et mettez la valeur du
backlog
delisten(2)
à0
et essayez de lancer plusieurs clients en même temps sans rien entrer.- Déterminez le nombre maximal de clients qui peuvent être en attente.
- Que se passe-t-il si on écrit une ligne dans le client n°2, puis une ligne dans le client n°1, puis termine le client n°1 (Ctrl-D) ?
- Mêmes questions avec un
backlog
maximal.
- Vous aurez besoin des appels système suivants:
accept
,socket
,connect
,listen
Poll (multiplexage)
- En utilisant l’appel système
poll(2)
modifiez le serveur et créezsrv_poll.c
pour qu’il puisse traiter plusieurs clients en même temps.- Le serveur surveille en parallèle (avec
poll(2)
) le socket d’écoute ainsi que chacun des sockets des clients connectés - Le serveur accepte les nouveaux clients au fur et à mesure (jusqu’à 10 clients au maximum)
- Quand un client envoie des octets, il lui sont immédiatement renvoyés.
- Quand un client ferme son socket, il est retiré de la liste.
- Le serveur surveille en parallèle (avec
- Modifiez le serveur et mettez la valeur du
backlog
delisten(2)
à0
et essayez de lancer plusieurs clients en même temps sans rien entrer.- Déterminez combien de clients maximal peuvent être en attente.
- Que se passe-t-il si on écrit une ligne dans le client n°2, puis une ligne dans le client n°1, puis termine le client n°1 (Ctrl-D) ?
Chat
- Modifiez le serveur et créez
srv_chat.c
pour qu’il renvoie les messages à tous les clients connectés SAUF à celui qui a envoyé le message original.- Lancez deux clients et conversez :)
- Que se passe-t-il si on lance un 3e client:
./cli < /usr/share/dict/words
? - Même question, mais avec
strings /dev/urandom | ./cli
?