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.cqui 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.cqui 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
backlogdelisten(2)à0et 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
backlogmaximal.
- 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.cpour 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
backlogdelisten(2)à0et 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.cpour 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?