Laboratoire 11 - Sockets et multiplexage

Page content

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

  1. 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.
  2. Développez un client simple cli.c qui attend une ligne de l’entrée standard (avec fgets(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.
  3. Modifiez le serveur et mettez la valeur du backlog de listen(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) ?
  4. Mêmes questions avec un backlog maximal.
  • Vous aurez besoin des appels système suivants: accept, socket, connect, listen

Poll (multiplexage)

  1. En utilisant l’appel système poll(2) modifiez le serveur et créez srv_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.
  2. Modifiez le serveur et mettez la valeur du backlog de listen(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

  1. 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 ?