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

POSIX C Discussion :

Fork, pthread et serveur multi-clients


Sujet :

POSIX C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut Fork, pthread et serveur multi-clients
    Bonjour à tous,

    On vient de me donner le code d'un serveur en C pour que je le modifie. Dans l'état actuel des choses, le client se connecte au serveur pour lui envoyer un login et une ip. Pour chaque connexion, le serveur fait un fork pour traiter les données. Le but est maintenant de stocker ce couple (ip,login) dans une table de hachage. J'ai déjà codé les fonctions pour la table de hachage mais il me reste un gros problème à résoudre.

    Il y a longtemps que j'avais pas fait de programmation système et donc, dans un élan d'enthousiasme, j'ai rajouté les fonctions ajout_hash dans le traitement... sauf que ma table de hachage est dupliquée pour chaque processus traitant les demandes

    La seule solution que je vois là serait de faire communiquer les processus qui traitent les connexions avec le processus père. Ainsi, seul le processus père connait l'état de la table de hachage et peut ajouter ou supprimer les données...

    Maintenant, il y a peut être d'autres solutions, comme par exemple un second serveur qui se contente de communiquer avec les processus qui traite les connexions pour garder la table de hachage à jour... sachant qu'il faut aussi qu'on puisse accèder au données de la table.

    J'ai pensé aux tubes, aux mécanismes IPC mais je ne suis pas vraiment expert dans ce domaine...

    Merci pour vos conseils!

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Bonjour,

    Je comprends pas vraiment ton problème. Ton problème se situe dans le fait que le processus père posséde une table de haschage et que lorsqu'il crée des fils ces derniers possédent une copie ? Si c'est cela pourquoi cela pose t-il problème ? J'avoue ne pas comprendre.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Désolé, je me suis mal expliqué. Vu qu'il y a plusieurs connexions qui peuvent arriver, elles sont traités par différents processus. Cependant, les données reçues par le serveur (les couples (login,ip)) doivent être stockées dans la table de hachage du processus père.

    En gros, comme c'est là, même si je la passe en paramètre aux processus fils, ils ajoutent la connexion qu'ils viennent de traiter mais à la fin du processus, la table de hachage est redevenue vide puisque le processus fils a travaillé sur sa propre copie...

    J'espère avoir été plus clair

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pourquoi ne pas utiliser des threads à la place d'un fork... Tu n'aurais plus le même genre de problème...

    Jc

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Je sais pas si en rajoutant le qualificatif static de ta table de haschage ( qui je suppose est local à la fonction main) cela permet de la conserver

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par hegros
    Je sais pas si en rajoutant le qualificatif static de ta table de haschage ( qui je suppose est local à la fonction main) cela permet de la conserver
    Non ca ne marche pas. Maintenant je vais essayer les threads comme me le conseille fearyourself. Je vous tiens au courant dés que c'est testé

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    J'ai fait quelques recherches sur les pthreads et ca à l'air plutot pas mal. Par contre, si j'ai bien compris, pour passer des paramètres au threads, il faut passer un pointeur sur une structure, le tout casté en (void *). Et donc, pour les ajouts dans la table de hachage, il faut que j'utilise l'exclusion mutuelle, n'est ce pas?

    Merci d'avance! :-)

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Oui, tu auras besoin d'exclusion mutuelle, dès que tu as au moins un thread qui doit écrire (car il est imprudent de lire la table pendant qu'elle est modifiée).

    Pour cela, soit tu fais du multi-lecteurs/écrivain (les threads lecteurs peuvent lire simultanément) --> pas toujours facile à implémenter, mais plus performant
    soit tu fais de l'exclusion mutuelle pure (Les threads ne peuvent plus lirent simultanément) --> moins performant, mais plus simple à implémenter: un simple mutex suffit.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Donc en gros c'est quelque chose comme ça qu'il faut que je fasse :

    http://fr.wikipedia.org/wiki/Probl%C3%A8me_des_lecteurs_et_des_r%C3%A9dacteurs

    Enfin à mon avis, je peux retirer le sémaphore M_Red qui n'a pas un grand intérêt à mon sens...

    Merci pous vos conseils

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Bien j'avance dans mes recherches et j'ai différentes questions.

    Donc il me semble que dans mon cas, les phreads seraient bien plus pratiques au niveau de la gestion de la table de hachage. Par contre j'ai trouvé le code d'un serveur censé géré le multi-client mais ca n'a pas l'air de fonctionner. Quand je rallonge les temps de traitement, je ne vois qu'un client à la fois... Donc je voulais savoir si c'est possible de gérer du multi-client avec les pthreads?

    Sinon, est ce qu'il vaut mieux créer plusieurs threads dés le début qui écoutent tous pour voir s'il y a des connexions ou bien créer un thread par connexion? Il ne devrait pas y avoir un très grand nombre de connexion simultannées.

    Merci d'avance!

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Donc je voulais savoir si c'est possible de gérer du multi-client avec les pthreads?
    Bien sûr, la question est de voir comment tu gères les connections, à quel moment est-ce que tu utilises tes mutex/sémaphores pour les zones critiques...

    Sinon, est ce qu'il vaut mieux créer plusieurs threads dés le début qui écoutent tous pour voir s'il y a des connexions ou bien créer un thread par connexion?
    Il vaut mieux (voir c'est la seule solution plausible) avoir un thread qui écoute, lorsqu'il y a une connection, créé un autre thread qui gère la connection.

    Jc

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Ok donc là en gros c'est ce que j'ai mais avec des forks! Plus qu'à modifier ca avec des pthreads!

    Au niveau sémaphores, j'en aurais un pour la lecture et un pour l'écriture, c'est pas ce point là qui me pose problème, c'est plutot le fait que plusieurs connexions soient gérées en même temps...

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je ne vois pas vraiment le problème tu as un serveur qui "écoute" pour les connections (si on est en TCP)... Lorsqu'il détecte un nouveau client, il créé un thread qui le gère et se remet à écouter...

    La question de gérer plusieurs connections n'est pas vraiment un problème puisqu'il y a une file d'attente pour les connections en attente. Donc même si tu as deux clients qui veulent se connecter en même temps, la file d'attente le gérera correctement... (il faut juste pas qu'il déborde mais même, à ce moment la connection est simplement refusé au niveau du client)

    Du coup, si deux clients veulent se connecter en même temps, le serveur voit le premier, créé un thread qui s'occupera du client, et ensuite s'occupera du deuxième. Tout ceci est plus ou moins interne à la gestion de TCP....

    Si tu es en UDP, c'est un peu plus compliqué mais pas trop non plus... Comme premier abord, utilise plutôt TCP...

    En espérant avoir répondu à la question,
    Jc

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    Ok, sauf que là moi j'avais ce genre de chose avec des fork:

    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
    if ((pid = fork()) == -1)
    	{
    	  close(sock_waiting);
    	  close(ctrl.cnx_sock);
    	  error_detected("fork error", 1);
    	}
          else
    	if (pid == 0)
    	  { 
    	    close(sock_waiting);
    	    handle_client(&ctrl);
    	    exit(0);
    	  }
    	else
    	  close(ctrl.cnx_sock);
    Donc je peux plus gérer de la même manière si j'ai bien compris. Parce que si je ferme ctrl.cnx_sock dans le père, ca va le fermer aussi pour le thread non?

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/04/2010, 23h34
  2. serveur multi client avec fork()
    Par deby23 dans le forum Réseau
    Réponses: 17
    Dernier message: 11/09/2007, 16h32
  3. serveur multi clients
    Par aaronw dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/03/2006, 09h01
  4. Serveur Multi-clients
    Par darsky dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/04/2004, 09h53
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

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