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

Développement Discussion :

Comment faire un serveur hébergeant plusieurs client simultanée


Sujet :

Développement

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut Comment faire un serveur hébergeant plusieurs client simultanée
    Bonjour,

    Je débute dans la programmation réseau, donc peut être que mes questions vont paraitre évidentes.
    Donc je voudrai savoir comment fait-on pour lancer plusieurs connexion à un serveur, comment fait il pour les gérer.
    J'ai entendu parler de la fonction systeme fork() pour lancer un processus fils, mais lorsque le procesus fils est lancé comment faut-il faire pour vérifier si une socket n'est pas déjà prise et comment lancer une seconde connexion.

    Pour etre plus clair j'aimerai savoir comment faire pour qu'un serveur gère plusieur conexion de client simultanément.

    Merci d'avance pour les réponses ^^.

  2. #2
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Il existe plusieurs façons de gérer plusieurs clients...

    Il y a celle qui utilise en effet fork(). Je vais essayer de te l'expliquer en étapes :

    1) Le serveur écoute sur une socket d'écoute (listenfd). Il attend qu'un client se connecte.

    2) Le client fait une demande de connexion sur listenfd. Le serveur crée une socket connectée (connfd) et le client s'y connecte. Ensuite, le serveur crée un processus fils qui aura les mêmes sockets que lui.
    La différence vient du fait que le processus père coupe la connexion au niveau de connfd, et le processus fils coupe celle au niveau de listenfd (il n'en a pas besoin).

    3) Ca recommence autant de fois qu'il le faut...

    En gros, ça ressemble à ça :

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client °                ° listenfd  Serveur
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client ° __________ ° listenfd  Serveur  (Demande de connexion)
    3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        ° listenfd
    Client ° ---------- ° connfd     Serveur  (Connexion)
    4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                        ° listenfd
    Client ° ---------- ° connfd    Serveur  (Création du process fils)
            \
             \        ° listenfd
              ------- ° connfd   Child
    5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Client °         ° listenfd  Serveur (Suppression des sockets inutiles)
            \
             \
              ------ ° connfd  Child

    Il existe une deuxième solution qui consiste à créer un tableau de sockets,
    qui sont à -1 si elles sont disponibles. Quand un client se connecte, on y met la valeur de la socket. Pour gérer le tout, on utilise généralement select().

    Désolé si j'ai pas été super clair, mais bon spas facile à expliquer comme ça

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut
    Donc si je comprend bien.

    Le serveur lance une fonction d'écoute sur une socket qui ne servira qu'à ça.
    Lorsqu'un client se connecte sur cette socket, le message est envoyé au serveur.
    Suite à ce message le serveur lance une autre fonction qui consiste à créer un processus fils ayant les mêmes valeurs que le père.

    Donc j'arrive à cette réflexion :
    Si le père est sur une socket, le fils sera sur la même ou faut-il qu'il ouvre une autre socket ?

    Imaginons qu'il ouvre une autr socket, le client va donc devoir recevoir le nouveau port de la socket, comment cela se fait ?

    Sinon si le fils a la même socket que le père, celle de l'écoute, lorsque d'autre client vont vouloir se connecter ce sera toujours le même port qui va être ouvert et donc conflit.
    Ou alors faut que la socke d'écoute change de port à chaque fois qu'un client s'est connecté.

    Et pour la seconde solution je ne vois vraiment pas comment faire.
    Je ne vais quand même pas lister tous les ports utilisables.
    J'ouvre un port que si un client se connecte, alors comment je fais pour que le serveur ouvre un autre port et qu'ensuite il les gère tous sans processus fils ?

    Je dois avouer que ce n'est pas très clair (je ne dis pas ca méchamment ) ou alors c'est moi qui ne comprend pas .
    Je pense aussi ne pas avoir été très clair dans mon raisonnement, alors si vous avez des questions n'hésitez pas.

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    je te conseille de lire ceci... http://www.ensta.fr/~gueydan/Poly/Html/node17.html

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut
    Merci le site a l'air pas mal, seuleument il ne fait que m'expliquer comment se déroule un dialogue entre client et serveur mais pas comment ile serveur fait pour gérer plusieurs connexion.

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 854
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 854
    Points : 15 274
    Points
    15 274
    Par défaut
    mais pas comment le serveur fait pour gérer plusieurs connexion
    Relis le lien, c'est écrit en bas :
    Le descripteur initial peut encore servir à de nouveaux clients pour se connecter au serveur, c'est pourquoi les serveurs appellent ensuite généralement la fonction fork() afin de créer un nouveau processus chargé du dialogue avec le client tandis que le processus initial continuera à attendre des connexions
    Et j'ajouterai "man fork", bien sûr !

    Mes 2 cts,
    --
    jp

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut
    Désolé je n'avais pas vu cette ligne

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut
    Me voila de retour !!!

    Bon j'ai bien compris le fait qu'il fallait des fork pour dupliquer le processus serveur.

    Seulement voila, ca c'est pour un client et un serveur, malheureusement il faut que deux client interagisse en meme temps sur le meme serveur.
    En fait je suis en train de créer un jeu d'echec ( la partie avec la verif des pieces et fini ) en reseau le tout programmé en langage C.
    Il faut que deux joueur puisse se connecter sur le serveur et jouer, mais aussi que d'autre client puissent se connecter et jouer.
    donc le joueur 1 envoie les données au serveur qui valide ou non son coup, ensuite le serveur affiche le plateau modifier. Le joueur 2 peut envoyer aussi les coordonnées souhaitées.

    Comment faire pour que le serveur alterne entre le joueur 1 et le joueur 2 ???

    Donc voila, pour l'instant je ne sais vraiment pas comment gérer ca.

    Aidez moi parce que je patoge.

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 854
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 854
    Points : 15 274
    Points
    15 274
    Par défaut
    Salut !
    Comment faire pour que le serveur alterne entre le joueur 1 et le joueur 2 ???
    Ben, en réfléchissant un peu, lol !
    Oublie le mot "serveur", maintenant t'as des process "forkés", un fork par joueur.
    Donc avant de forker un process au moment d'une connection, tu crées une table où tu vas assigner, par exemple, joueur1 à un fork, joueur2 à un autre and so on, et tu inventes un système de dispatch à partir de cette table.
    Enfin, moi, j'essayerais de faire comme ça.
    QQun a p'têt une meilleure idée.
    Mes 2 cts,
    --
    jp

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut
    Bon tout d'abord désolé de repondre seulement maintenant.

    Ensuite, j'y ai réfléchi mais je ne vois quand meme pas comment les deux joueurs vont faire pour jouer à la meme partie si ils sont sur un fork different.

    Je tiens a dire que moi et les processus lancés en paralelle, on fait pas bon menage. J'ai du mal à capter le principe, même si ca a pas l'air si compliqué que ca pour certain .

    Si tu pouvais plus développer ton idee de tableau qui dispatche les joueurs sur les processus "forkés", ca m'arrangerait drolement.

    Merci en tout cas d'avoir répondu ^^

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 854
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 854
    Points : 15 274
    Points
    15 274
    Par défaut
    Yop !
    J'ai du mal à capter le principe
    Ben (on va causer Linux) tu as un daemon qui tourne, un process "père" on va dire, qui écoute sur la socket de connexion, 24/24.
    Quand un client se connecte, le process "père" se duplique (fork) et crée un process "fils" qui hérite de certains trucs de son père (me rappelle plus quoi), et qui va gérer la connexion de travail proprement dite, pendant que le "père", qui continue à tourner, surveille s'il en arrive d'autres.
    Dans ton contexte, le "père" doit donc maintenir une table de ses "fils", et une autre table des connexions deux à deux, je dirais.
    Je peux pas en dire plus, après on entre dans des détails liés à ton projet.
    Mais je crois surtout qu'il te faut un peu étudier ces histoires de fork et que ça devienne clair pour toi pour pouvoir avancer.
    Bon courage,
    --
    jp

  12. #12
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Salut, si c'est juste pour une partie d' échecs à deux joueurs, il suffit que l'un fasse le serveur et l' autre le client... Juste deux sockets, sans fork ni thread ni select. Non?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut
    Bon merci pour les explications je vois maintenant a peu près le principe. Seulement j'ai un probleme de comprehension au niveau de la gestion des processus fils. Le tableau de processus n'existe pas en C, comment je peux créer un tableau gérant les fils ???

    Sinon pour repondre a lunixinclar, si ce n'était que ca j'aurais deja fini, mais le probleme est que pour la partie d'echec il faut qu'il y ait deux joueurs qui se connectent en meme temps sur un serveur, d'où mon probleme.

    Ta solution me propose de lancer une partie d'echec sur un seul serveur avec un seul client ce sui suppose que les deux jouerus sont sur le même PC. Seuleument voila, il me faut deux joueurs distinct se connectant à distance.

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 854
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 854
    Points : 15 274
    Points
    15 274
    Par défaut
    Le tableau de processus n'existe pas en C
    Ça ne t'empèche pas de te créer ton type de tableau à toi, en y insérant le PID du processus fils (je crois que le père peut le récupérer, je sais plus trop comment, j'ai ça sous Linux mais là ch'suis sous Ouinouin).
    HTH,
    --
    jp

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 111
    Points : 62
    Points
    62
    Par défaut
    Merci ca y st je vois mieu ce que tu veux dire

    Bon je laisse le topic ouvert au cas ou j'ai du mal.

    Merci en tout cas pour les explications

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut même problème pour mon jeu.
    Bonjour,
    J'ai pratiquement le même problème avec mon jeu.
    Voilà ce que fait dans le seveur:
    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
    int nConn=2;
    int servSock;
    int clientSock[2];
    
     //créer un socket,bind et listen sur 'localhost:8000'
    
    servSock = Init(8000)
    
    // créer deux connections clients
    while(nConn){
            nConn--;
            // newConn contient un accept.
            clientSock[nConn]= newConn(servSock);
    }
    
    //Désormais j'arrive à écrire aux deux fils en utilisant clientSock[]


    Le problème qui se pose est que à la connection, chaque client arrive à m'envoyer son nom.

    Mais après dans la boucle du jeu ,un write dans le client retourne -1.
    mais le client arrive toujours à lire : read() marche bien!
    Etrange non ?
    Je travaille sur la boucle locale (serveur + 2 clients sur la même machine :localhost)

    Please aidez-moi si vous avez une idée du problème. Merci.

Discussions similaires

  1. [WD14] comment faire le serveur/client
    Par alhco1 dans le forum WinDev
    Réponses: 1
    Dernier message: 01/02/2011, 20h04
  2. Comment faire pour choisir entre plusieur elements d'un filelist ?
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 21/07/2006, 18h51
  3. Réponses: 3
    Dernier message: 16/05/2006, 10h32
  4. Comment Faire un serveur d'impression sous linux !!
    Par pedrosystem dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 23/03/2006, 10h29
  5. Réponses: 6
    Dernier message: 15/02/2006, 19h29

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