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 :

Structure contenant une socket


Sujet :

Réseau C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Par défaut Structure contenant une socket
    Bonjour,

    J'ai un soucis lorsque je fais un write() vers une socket qui est contenue dans une structure qui elle est placée dans une file de messages ...

    illustration:

    Coté Client:
    - Un fork() permettant la réception des messages envoyés par le serveur est lancé
    - Envoie des requêtes (qui sont ajoutées dans une file de messages coté serveur).

    Coté Serveur:
    - Des fork() pour accepter les clients sont lancé (quand le premier client est accepté, un autre fork() qui est unique est lancé et permet de gère la file de messages).

    -On récupère les requêtes envoyées par les clients dans la structure et on y ajoute leurs SOCKET, une fois cela fais on place la structure dans la file de messages.

    structure:
    la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct TRT TRT
    struct TRT{     
         ...
         SOCKET csock
    };
    -Le fork() qui traite la file de messages notifie les clients une fois leurs requêtes traité

    Problème:
    -Quand le fork() qui traite la file de messages notifie les clients seul le premier client est notifié via un write(trt.csock,...); pourtant toutes les requêtes sont traité et dans la partie du code ou se trouve les write(), les printf() de debug sont bien affiché, et quand j'affiche la SOCKET contenu dans ma structure j'ai le même résultat lorsque j'affiche la SOCKET que après avoir accepte le client.

    note: j'ai remarqué que si je lance le fork() qui gère la file de messages avant d'accepter les clients, même le premier client n'est plus notifier via sa SOCKET et pourtant les requêtes de ma structure sont bien géré.

    Bien à vous!

    (Désolé des fautes d’orthographes restante, je ne suis pas très fort pour ça).

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Gérer un serveur avec des forks ? J'avais jamais vu ça encore... C'est une contrainte imposée ? Si ce n'est pas le cas, je te recommande très fortement de regarder pthread.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par imperio Voir le message
    Gérer un serveur avec des forks ? J'avais jamais vu ça encore... C'est une contrainte imposée ? Si ce n'est pas le cas, je te recommande très fortement de regarder pthread.
    Aujourd'hui, oui. Jusqu'à une époque récente (par rapport à l'âge du système, et même à Linux qui va sur ses 24 ans tout de même), il n'y avait rien de normalisé de ce côté-là sous UNIX. Par conséquent, on forkait (même si clone() sous Linux permettait de faire les choses plus finement) et, par conséquent, on essayait de limiter le nombre de processus fils, voire même de les éliminer complètement quand il était envisageable de tout faire dans une même boucle principale (par exemple, un petit serveur de chat limité à quelques personnes). Algorithmiquement, c'est quand même intéressant d'être capable d'implémenter soi-même du multitâche quand le système ne propose pas de quoi le faire (notamment dans les systèmes embarqués et les petits micro-contrôleurs).

    Puisque les pthreads sont normalisés et proprement implémentés, ce n'est plus la peine de s'en passer, bien sûr. C'est plus facile à gérer, ça permet de tuer un client en particulier sans casser tout le serveur et ça protège aussi celui-ci en cas de de segfault. Par contre, ça n'est vrai que jusqu'à une certaine limite. Dès qu'il s'agit de monter en charge et d'être rapide en servant des milliers de clients à la fois, créer au moins un thread par connexion active risque de commencer à être très couteux.

  4. #4
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    @Obsidian: Merci beaucoup pour ces éclaircissements !

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/12/2011, 18h48
  2. [POO] ajouter des données dans un tableau contenant une structure
    Par Peanut dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2009, 18h41
  3. Dupliquer une structure contenant des mutables
    Par bumbolol dans le forum Caml
    Réponses: 6
    Dernier message: 28/01/2009, 21h37
  4. Réponses: 5
    Dernier message: 09/07/2006, 18h40

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