Serveur multitache

Gardez bien le source du TP précédent et repartez du "serveur.c" l'orignal.

Le TP2 a plusieurs problèmes:

Pour améliorer le serveur on va le séparer en un programme A acceptant les connexions et lançant des programmes B qui font réellement le boulot. La boucle infini d'un tel programme fait :
Boucle infini
   On accepte la connexion.
   On lance un nouveau processus avec la fonction fork()
   Si l'on est dans le fils (fork() a retourné 0)
        ALORS
        On ferme le socket qui était en attente de connexion
        On ouvre la connexion en direction du vrai serveur
        Boucle infini
            On attend une donnée du vrai client ou vrai serveur
            Si erreur de lecture
                On fait un exit(0) pour terminer.
            On la transmet à l'autre
            Si erreur d'écriture
                On fait un exit(0) pour terminer.
   FIN SI
   On ferme le socket retourné par l'acceptation
Modifier le TP2 en conséquence.

Remarque : Le lancement d'une THREAD est plus rapide qu'un processus car rien n'est dupliqué (à part la pile) mais la programmation est plus complexe car le partage de variables nécessite l'utilisation de sémaphores.

Pour éliminer les Zombis, il est intéressant d'ajouter après l'acceptation de connexion :

/* int status */
while ( waitpid(-1, &status, WNOHANG) > 0 ) /* vide */ ;

Last modified: Mon Jan 29 11:52:24 CET 2001