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 :

serveur multi client avec fork()


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 30
    Points
    30
    Par défaut serveur multi client avec fork()
    bonjour, actuellement en formation je bosse sur un projet qui doit aboutir à la récuperation de données (style annuaire) stockées sur un serveur...
    à l'heure actuelle nous en sommes juste à la communication entre le client et le serveur c'est à dire demande de connection, accept, et affichage du style "hello world". jusqu'à là ça va ! lol dialogue ok ! mon souci du moment est l'ajout d'un client ou plus exactement à dupliquer style père fils avec la fonction "fork", comment l'intègrer dans mon code? vous l'aurez compris je suis débutant et utilise le langage C. je vous sollicite donc pour des infos diverses sur les sockets et sur cette fonction "fork" dans un premier temps puis sur la création d'un annuaire consultable par les clients..
    Merci d'avance de votre aide...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Bonjour,
    Premièrement, il faut savoir que la méthode "serveur-fork" n'est pas adaptée à tous les serveurs. Je la déconseille pour tout serveur où un client peut avoir une influence sur les autres.
    Dans le cas présent, un client n'a d'influence sur aucun autre, le serveur-fork est donc une bonne méthode.

    Infos sur les sockets: chercher sur le site, il y a des tutoriaux.
    La fonction fork() : C'est l'unique méthode sous *n*x pour créer un processus fils. Si tu consultes l'aide, tu verras qu'après un fork() :
    • Le processus père continue toujours après le fork. La valeur de retour de fork() est soit -1 (erreur, aucun fils créé), soit une valeur positive non-nulle: L'ID du processus fils.
    • Le processus fils (s'il a été créé) continue lui aussi après le fork() : Sa seule différence avec le processus père, c'est que pour lui fork() a retourné zéro, et son ID a changé.
    • Donc, après un fork(), chacun des deux processus doit consulter la valeur de retour pour savoir s'il est le père ou le fils.

    Il y a plusieurs façons de l'utiliser, mais dans le cas d'un serveur:
    • La création de processus fils se fait dans une boucle
    • Un fils ne retourne pas dans la boucle après être créé
    • Seul le compte de processus fils doit être mémorisé, on se moque de leurs IDs.

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Après il faut savoir combien de connexion ton annuaire peut avoir simultanément, si ce nombre est élevé fork est une mauvaise idée, en effet il me semble que sous *n*x le nombre de processus est limité (1024 ?).

    Après une solution basique de client-serveur reste l'utilisation de select.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Exemple de fork (peudocode)
    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
    22
    23
    24
    25
    26
    int main(void)
    {
    	res = 0
     
    	idAvant = getpid()
    	printf "Avant séparation, mon id est %d", idAvant
    	resFork = fork()
    	idApres = getpid()
     
    	if resFork == -1
    	{
    		printf "Erreur"
    	}
    	else if resFork == 0
    	{
    		printf "fork() a retourné %d, Je suis le fils, mon id était %d, maintenant il est %d", resFork, idAvant, idApres
    		res = 5
    	}
    	else
    	{
    		printf "fork() a retourné %d, Je suis le pere, mon id était %d, maintenant il est %d", resFork, idAvant, idApres
    		wait(&resultatFils)
    		printf "Le fils a retourné %d", WEXITSTATUS(resultatFils)
    	}
    	return res
    }
    Normalement, ce genre de code doit écrire un truc du genre:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avant séparation, mon id est 42
    fork() a retourné 84, je suis le pere, mon id était 42, maintenant il est 42
    fork() a retourné 0, je suis le fils, mon id était 42, maintenant il est 84
    Le fils a retourné 5
    Note: La fonction wait() attend la fin d'un processus fils, n'importe lequel (ici, il n'y en a qu'un) et retourne son résultat dans la variable pointée.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup Medinoc et skyrunner !
    20 min que je suis inscrit sur le site et ça vaut bien des heures de surf !
    donc dans mon cas la fonction fork semble donc adapté nickel !
    je vais aussi voir du coté du select que je ne connais pas...
    je vais scruter ça de plus près mais juste une question je ne pige pas bien le retour de la valeur 5??? fils crée mais pourquoi res=5 ??

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par deby23 Voir le message
    Merci beaucoup Medinoc et skyrunner !
    20 min que je suis inscrit sur le site et ça vaut bien des heures de surf !
    donc dans mon cas la fonction fork semble donc adapté nickel !
    je vais aussi voir du coté du select que je ne connais pas...
    je vais scruter ça de plus près mais juste une question je ne pige pas bien le retour de la valeur 5??? fils crée mais pourquoi res=5 ??
    En fait dans le processus père, fork retourne le PID de son fils nouvellement crée. Donc dans ce cas le fils a pour PID 5. Cette valeur changera tout le temps pratiquement.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 30
    Points
    30
    Par défaut
    merci skyrunner, je vais tester ça ...
    je ferais un suivi parce qu'il me reste du boulot ! lol
    encore merci et bravo pour votre disponibilité !

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Skyrunner s'est trompé.

    La valeur 5 est arbitraire, je l'ai mise pour montrer:
    • que le main() d'un programme peut retourner autre chose que zéro, EXIT_SUCCESS, etC.
    • Que la fonction wait() récupère la valeur retournée par le main() du processus fils (attention, limitée à 255 ou à 127, je ne sais plus).


    Le PID du fils nouvellement créé, dans mon exemple, c'était le 84.

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Skyrunner s'est trompé.

    La valeur 5 est arbitraire, je l'ai mise pour montrer:
    • que le main() d'un programme peut retourner autre chose que zéro, EXIT_SUCCESS, etC.
    • Que la fonction wait() récupère la valeur retournée par le main() du processus fils (attention, limitée à 255 ou à 127, je ne sais plus).


    Le PID du fils nouvellement créé, dans mon exemple, c'était le 84.
    Hop pardon j'avais mal lu désolé.
    Oui le pere attend la fin de son fils via wait, ensuite recupere la valeur retourné à sa mort (le return du main ou un exit) via la macro WEXITSTATUS.

    Désolé j'aurais du lire.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Skyrunner Voir le message
    Hop pardon j'avais mal lu désolé.
    Oui le pere attend la fin de son fils via wait, ensuite recupere la valeur retourné à sa mort (le return du main ou un exit) via la macro WEXITSTATUS.

    Désolé j'aurais du lire.
    Désolé mais je ne pense pas..

    Le père attend la FIN du fils via signal SIGCHLD.

    En effet, le père, une fois le fork lancé, revient en attente de demande de création d'un nouveau serveur...

    C'est le principe des services (telnet etc..)...

  11. #11
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Désolé mais je ne pense pas..

    Le père attend la FIN du fils via signal SIGCHLD.

    En effet, le père, une fois le fork lancé, revient en attente de demande de création d'un nouveau serveur...

    C'est le principe des services (telnet etc..)...
    Euh, dans le code de Medinoc le pere attend son fils avec la fonction wait.
    Mais on peut aussi installer un handler sur le signal SIGCHLD.

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Skyrunner Voir le message
    Euh, dans le code de Medinoc le pere attend son fils avec la fonction wait.
    .
    mais à ce compte-là ce n'est pas vraiment un serveur, car il ne peut avoir qu'un seul fils...

  13. #13
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    mais à ce compte-là ce n'est pas vraiment un serveur, car il ne peut avoir qu'un seul fils...
    Exact mais c'était pour montrer l'utilisation de fork.

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    vi vi mais je rappelle que le titre du PO était "multi-clients"...

  15. #15
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Oui c'est vrai faut pas qu'on s'éloigne trop de ce que le PO veut.

    Donc pour un serveur multi-client utilisant les thread faut installer un handler sur le signal SIGCHLD.

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Arrêtez de sortir des bêtises semant la confusion.
    • Mon exemple d'utilisation de fork() n'avait rien à voir avec un serveur. C'était un exemple basique de fork().
    • En effet, un serveur multi-client ne peut inclure wait() dans sa boucle principale. Mais je ne sais pas ce qu'il faut faire alors. Installer un handler vide pour SIGCHLD est-il suffisant ? superflu ?

  17. #17
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Arrêtez de sortir des bêtises semant la confusion.
    • Mon exemple d'utilisation de fork() n'avait rien à voir avec un serveur. C'était un exemple basique de fork().
    • En effet, un serveur multi-client ne peut inclure wait() dans sa boucle principale. Mais je ne sais pas ce qu'il faut faire alors. Installer un handler vide pour SIGCHLD est-il suffisant ? superflu ?
    J'ai exactement dit ce que tu viens de dire, que ton code sur fork était juste un exemple d'utilisation de fork basique, pas pour un système de client-serveur.

    Et j'ai juste rajouté que pour le problème du PO en cas d'utilisation de fork pour son client-serveur il pouvait utiliser un handler sur le signal SIGCHLD, c'est tout, donc on se calme.

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Installer un handler vide pour SIGCHLD est-il suffisant ? superflu ?
    En principe ce serait superflu si on n'a rien de particulier à faire lors de la mort d'un enfant (comme mettre à jour une liste interne).

    Mais en général dans un serveur multi-client "industriel", l'inclure, juste pour être prêt à inclure une telle possibilité. Mais dans ce cas-là, lorsque l'attente du serveur est interrompue, il faut vérifier que c'est pour une vraie demande de connection et non pas justement par la mort d'un enfant... et si c'est le cas, ré-initliser le signal et repartir en attente..

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/04/2010, 23h34
  2. Probleme Serveur/Multi-client avec socket
    Par CouaC dans le forum Réseau
    Réponses: 9
    Dernier message: 18/06/2007, 00h49
  3. Fork, pthread et serveur multi-clients
    Par Pico10 dans le forum POSIX
    Réponses: 13
    Dernier message: 05/01/2006, 11h48
  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