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

C++ Discussion :

transfert de socket entre machines


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut transfert de socket entre machines
    Bonjour,

    J'aimerais savoir si il est possible de transferer un socket entre deux machines.
    Imaginons qu'une machine A, qui est un serveur de jeu, à 50 clients connectés, imaginons maintenant une machine B, un serveur de jeu du même type, doit recevoir ces 50 clients, sans qu'il n'y ai une intérruption dans le jeu.

    Est-il possible de faire ce transfert ? Les données sécurisées seront transferées avant le transfert du socket, pour éviter tout problème

    Merci d'avance

    nico

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par DakM Voir le message
    Bonjour,

    J'aimerais savoir si il est possible de transferer un socket entre deux machines.
    Imaginons qu'une machine A, qui est un serveur de jeu, à 50 clients connectés, imaginons maintenant une machine B, un serveur de jeu du même type, doit recevoir ces 50 clients, sans qu'il n'y ai une intérruption dans le jeu.

    Est-il possible de faire ce transfert ? Les données sécurisées seront transferées avant le transfert du socket, pour éviter tout problème

    Merci d'avance

    nico
    Une socket est un descripteur qui référence une informations cachée dans l'OS. Cette information est liée à des données correspondant à la session réseau en cours ainsi qu'a une interface spécifique, elle même liée à une adresse MAC spécifique (et unique sur le sous réseau). On ne transfère pas les sockets, à moins de réaliser un système spécifique (sous Linux, c'est largement faisable avec un module kernel - qui n'existe pas à l'heure actuelle pour autant que je sache).

    Il existe des systèmes permettant de migrer des sessions entière entre des serveurs sans perte de fonctionnement. Généralement, ces solutions ne sont pas gratuites (et elles peuvent même couter très cher). Je ne serais toutefois pas surpris qu'un projet open source se soit penché sur le problème.

    Mais si le but est de migrer juste une application (ou son état) ainsi que des connexions réseau, il est peut être préférable de passer par une solution plus simple, avec une machine proxy qui va rediriger la connexion vers le serveur choisi.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Le but, est que mes joueurs connectés au serveur A soient redirigés vers le serveur B (IP/Port différents, ou pas!)
    En gros, que les paquets récus par la machine A soient redirigés vers la machine B (qui peut etre aussi la machine A, sur un port different)
    Il faut egalement que cette redirection ne soit pas notable en temps, le but étant à la machine A de pouvoir au minimum redemarrer pour une maintenance.

  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
    Une solution que je verrais (si cela est possible) serait d'envoyer l'adresse du deuxième serveurs aux clients pour qu'ils se connectent dessus. Cependant ce n'est possible que si tu as accès au code du client.

    Sinon à part rediriger les flux réseaux je vois pas trop comment faire...

    @Emmanuel Deloget: très intéressant, je pensais qu'une socket n'était défini que sur la machine sur laquelle il tournait. En gros on pourrait "s'envoyer" des sockets et tout reprendrait comme si de rien n'était ? C'est génial !

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par imperio Voir le message
    Une solution que je verrais (si cela est possible) serait d'envoyer l'adresse du deuxième serveurs aux clients pour qu'ils se connectent dessus. Cependant ce n'est possible que si tu as accès au code du client.

    Sinon à part rediriger les flux réseaux je vois pas trop comment faire...

    @Emmanuel Deloget: très intéressant, je pensais qu'une socket n'était défini que sur la machine sur laquelle il tournait. En gros on pourrait "s'envoyer" des sockets et tout reprendrait comme si de rien n'était ? C'est génial !
    C'est quand même plus compliqué que ça. Ceci dit, VirtualBox propose une option pour transférer une machine virtuelle en activité d'un hôte A vers une hôte B sans interruption de service. Et j'ai moi-même travaillé sur un projet de transfert d'un processus vers une autre machine du temps ou j'étais étudiant. Donc il est possible de trouver des moyens pour régler ce types de problèmes. Maintenant, coté trivialité, on peut faire mieux

    Ceci dit, la solution dont je parle (migration de sessions) ne présuppose pas la migration des services, mais de la session elle-même. Le principe est le suivant :

    1/ un proxy P en front end fait semblant d'être la machine de destination
    2/ il forwarde les requêtes vers la machine A
    3/ A prévient P qu'elle doit entrer en mode maintenance et qu'elle n'accepte aucune nouvelle connection
    4/ P met à jour le système pour rediriger les appels vers une machine B, identique à A
    5/ Une fois toutes les sessions de A terminées (on peut utiliser une granularité inférieure, en traitant requête par requête), toutes les nouvelles connexions sont routées vers B et A est mis hors ligne.

    C'est un principe similaire au load balancing (qui fait la même chose d'ailleurs). A ce propos, ça vaut peut-être le coup de regarder le projet haproxy (http://haproxy.1wt.eu/), utilisé pour faire du load balancing sur les serveurs haute performances et sur des connexions TCP.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    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
    Bien sûr, à ce moment-là c'est le proxy lui-même qui ne peut pas redémarrer en paix. Sans la collaboration du client, on ne peut pas vraiment faire mieux.
    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.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    Citation Envoyé par DakM Voir le message
    Imaginons qu'une machine A, qui est un serveur de jeu, à 50 clients connectés, imaginons maintenant une machine B, un serveur de jeu du même type, doit recevoir ces 50 clients, sans qu'il n'y ai une intérruption dans le jeu.
    En fait le plus gros "problème" sera que les serveurs se trouvent dans le même état.
    Avant de vouloir transférer les clients au nouveau serveur, le serveur doit être informé de l'état des joueurs, ou en tous cas devoir le retrouver.

    Une "solution simple" et naïve que je verrais bien, c'est d'envoyer au client un message particulier qui lui dit "hey, il est temps pour toi de te connecter à ce nouveau serveur xxx:yyy", le client a alors plus qu'à drop sa connection actuelle pour se reconnecter au nouveau.
    Mais pour éviter toute interruption, le nouveau serveur doit connaître plus que ses clients : il doit être conscient de leur état.

    Par exemple, je suppose que c'est le serveur qui a la connaissance des altérations d'état d'un joueur, le joueur/client n'est finalement qu'une super GUI des infos reçues par le serveur. L'ancien serveur doit alors donner cette info au nouveau serveur.
    Tout un tas de problème de ce genre peuvent se poser en fonction de la complexité du serveur, du client etc.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. transfert de savf entre deux machines
    Par rcordonnier dans le forum AS/400
    Réponses: 4
    Dernier message: 17/03/2010, 15h24
  2. Transfert de Spool entre 2 machines distantes
    Par FranckJTI dans le forum AS/400
    Réponses: 10
    Dernier message: 28/03/2008, 19h48
  3. Réponses: 3
    Dernier message: 30/03/2004, 09h38
  4. [Designer] Problème de transfert de données entre modul
    Par BILLYPATOU dans le forum Designer
    Réponses: 11
    Dernier message: 09/03/2004, 18h15
  5. [ netstat ] surveillance entre machines pour demon mysql
    Par gogozep001 dans le forum Développement
    Réponses: 2
    Dernier message: 28/08/2003, 11h05

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