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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    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 confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 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
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    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é !

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