IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

De la non utilisation du fork


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2003
    Messages : 217
    Par défaut De la non utilisation du fork
    Bonjour,

    Je suis en train de réaliser un serveur en C pour un projet. Pour information je suis sous environnement UNIX (darwin). Je me suis un peu documenté, c'est un peu compliqué sachant que les mans peuvent être quelquefois très mal faits.

    Bref, j'ai regardé quelques exemples et tous, après le accept, utilisent un fork() pour régler le problème des sockets bloquantes. Pour ma part, je ne suis pas particulièrement fan de cette solution, et je me demandais si c'était la meilleure.

    Ainsi, j'ai plutôt imaginé la structure de mon système ainsi :
    - Le serveur, lancé par launchd, fait un unique fork (ou bien lance directement un binaire différent) pour lancer le démon de traitement, les deux sont reliés par deux pipes. Il s'occupe de l'interface avec le réseau, connecte et déconnecte les clients, parse les requètes (en XML), et les transmet au démon de traitement.
    - Le démon de traitement reçoit les données de tous ses clients par une seule pipe, les traite, et en envoie au serveur par la seconde pipe, lequel dispatche aux clients.

    Ainsi, le serveur ressemblerait à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    exec('démon de traitement');
       => pipe('to démon de traitement');
       => pipe('from démon de traitement');
     
    socket/bind('connexion extérieure'); => fcntl('non bloquante');
     
    while(1)
    {
     
        accept('eventuel client'); => fcntl('non bloquante');
     
        if(select('lecture pipe et connexions'))
        {
            recv('pipe from'); => send('client');
            for('chaque client')
            {
                recv('client'); => send('pipe to');
            }
        }
     
    }
    Et le démon de traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while(1)
    {
     
        if(select('lecture pipe'))
        {
            recv('pipe to'); => traitement(); => send('pipe from');
        }
     
    }
    Ainsi, amha, il n'y aurait pas besoin pour le démon de traitement de s'occuper de toute la gestion réseau et cela règlerait énormément de problème. Seulement, je n'ai jamais fait de programmation sockets auparavant et je voudrais valider ma méthodologie :
    - Est-ce une façon viable de faire ? Y a-t-il des importants points de blocage que je n'aurais pas vu ?
    - Est ce que j'aurais besoin de mettre un test en écriture vers les sockets dans le select du serveur ou bien est ce que le tampon du système est assez grand pour ne jamais être overflowé ?
    - Du coup, est ce que j'aurais besoin de tampons au niveau du serveur pour transmettre les données des connexions à la pipe et vice versa ?

    Merci de vos réponses et éclaircissements, si vous avez des remarques supplémentaires, n'hésitez pas.

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    quel usine a gaz

    pourquoi ne pas utiliser select tout seul? sans fork et autres pipes?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2003
    Messages : 217
    Par défaut
    Parce que j'ai envie d'avoir une partie de traitement complètement indépendante du réseau. Genre que le traitement puisse tourner alors que le serveur ne transmet rien, ou l'inverse. Et que cela me semble peut être plus simple à mettre en œuvre.
    Mais je suis ouvert à d'autres possibilités, tu as quelquechose à me proposer pour fusionner les deux ?

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Pourquoi pas des threads ? (même si je suis souvent de l'avis qu'il vaut mieux utiliser des select au lieu de faire intervenir des threads ou processus supplémentaire).

    La création de thread mettent en général 15 fois moins de temps qu'une duplication de processus avec fork et permet d'éviter de bouffer de la mémoire pour rien (puisque seul une nouvelle pile est crée)

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2003
    Messages : 217
    Par défaut
    Pourquoi pas des threads ? Réponse simple : trop galère.
    Je suis conscient que ce serait une des meilleures solutions. Cependant c'est un petit projet pour lequel je n'aurais pas le temps d'apprendre la mise en œuvre et surtout de maîtriser l'utilisation des threads. Je dois par ailleurs avouer que j'avais dès le début complètement exclu cette option. A moins que l'on me fasse mentir, les threads sont tout de même (de l'aveu de certains de mes amis) assez complexes à intégrer. Par ailleurs, j'ai déjà les problèmes de socket à régler, je n'ai pas envie de devoir gérer en plus ceux que j'aurais avec les threads.

    Pour le coup, deux processus distincts seraient beaucoup plus simples à coder. Après, serait-ce une solution viable ? Quelle serait ses limites fasse à une solution select ou bien une solution threads ? Y aurait-il quelqu'un pour une comparaison/explication des 3 options ?

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Effectivement, les threads, c'est galère. C'est difficile à débugguer, c'est difficile à coder proprement. C'est pourquoi on utilise souvent (en C) des solutions à base de select jusqu'à ce que l'intervention des threads soient nécessaires (ou rende le code plus simple)

    Par ailleurs, j'ai déjà les problèmes de socket à régler, je n'ai pas envie de devoir gérer en plus ceux que j'aurais avec les threads.
    Dans ce cas, évite absolument les threads et concentre toi uniquement sur les sockets. Il est possible de faire à peu près tout rien qu'avec des select. Mais si tu penses que la solution avec fork te parait plus simple, fait comme tu le sens.

Discussions similaires

  1. Non-utilisation d'un caractère générique
    Par ehrhart.jy dans le forum Access
    Réponses: 2
    Dernier message: 13/07/2006, 11h02
  2. [TUNING] pb non utilisation de l'index
    Par ruthene dans le forum Oracle
    Réponses: 10
    Dernier message: 13/04/2006, 17h02
  3. Javascript : non utilisation du CSS
    Par lafracas dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 12/04/2006, 09h49
  4. [SERVICE INTERACTIF] Form non utilisable apres logoff/logon
    Par Spart64 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 05/03/2006, 13h32
  5. Réponses: 1
    Dernier message: 28/04/2004, 19h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo