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 :

client/serveur : synchronisation, tempo et ping de présence


Sujet :

Développement

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 7
    Points
    7
    Par défaut client/serveur : synchronisation, tempo et ping de présence
    Bon le titre est un peu fourre-tout mais bon...

    Voilà j'ai fait un programme client/serveur, je gère les connexions tout ça, jusque là aucun problèmes.
    Maintenant j'aimerais géré un système de timeout de connexion mais assez particulier. J'explique : mon applis serveur ne sert qu'a prendre en compte les clients qui souhaitent se connecter. Il y a vérification du paquet (ses données doivent contenir un chtit truc qui leur permet d'avoir une session...enfin bref là n'est pas la question) et si c'est bon l'appli serveur lance un processus fils qui, lui va géré exclusivement ce nouveau client sur un port TCP qu'il va ouvrir à cet effet (il contact le client, lui dit "youh ouh tu peus te connecter là" et c parti pour le blabla entre eux).

    Donc l'appli serveur principale laisse à la charge du proc fils de géré le dialogue proprement dis avec le client...

    Maintenant j'aimerais avoir un système de ping de présence entre le client et le proc fils qui lui a été aloué...genre toutes les 50 secondes le client envois un paquet de présence au proc fils sur le serveur. Bon jusque là c'est pas difficile. Mais au niveau proc fils serveur moi je veux pas faire un read non-bloquant (forcément). Donc je me dis hop un ptit sleep avant de 50 secondes, alors après une fois dans le read ben le paquet aura eu le temps d'arriver et si c pas le cas bon on ferme la connexion.
    Bon ok j'aurais pu géré ça avec select mais ça m'interesse pas (en effet là je n'ai qu'un descipteur dans mon cas et utiliser select serait bcp trop lourd si je devais en mettre un dans chaque proc fils...vu le peu de descripteurs à gérer enfin passons). Et je sais qu'on peu faire autrement.

    Bon maintenant le problème c'est de synchroniser le client et le proc fils serveur... Vous feriez quoi vous? parce qu'imaginez que le proc fils commence son sleep...30 secondes plus tard c'est à ce moment là que le client se décide à envoyer son paquet de présence. Bon le réseau est bon il arrive à bon port au bout de 5 secondes ok (euh un reseau bon avec un ping de 5 secondes? lol). Mais si il met 30secondes à arriver? le sleep se termine, le read non bloquant renvois 0...terminé la connexion est fermée.

    Bon c'est un peu tiré par le cheuveux mon truc et si j'ai pris des secondes au lieu de millisecondes c'était pour parler en temps humain

    voilà voilà, c'est un peu conceptuel comme discours je vous l'accorde mais je pense pas qu'il y ait besoin de code pour illustrer mes propos.

    Donc en résumé :

    - comment géré un timeout fiable sur une socket sans select()?
    - comment synchroniser les départ du client et du proc-fils pour les paquets de présence? (afin d'éviter au maximum un décalage temporel entre eux, si j'ai un décalage d'1 ou 2 sec c pas grave)

  2. #2
    m@
    m@ est déconnecté
    Membre actif
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Points : 292
    Points
    292
    Par défaut
    pour la synchro, pourquoi le proc fils ne fait-il pas un read bloquant ?
    Si vous fermez la porte à toutes les erreurs, la vérité restera dehors. (Tagore)

    Mandrake 10.1 up to date
    OpenBSD 3.5
    Win XP SP 2

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    oui pourquoi pas en effet, je me suis dit que ça pourrait marcher : je fais un read bloquant sur la première attente de paquet de présence. une fois qu'il est arrivé je lance mon système sleep()+read non blokant pour continuer.

    mais en fait il se pose un pb : si le reab bloquant reste bloqué indéfiniment tu fais cmt? on arrive au même prob...je pourrais pas geré le timeout de ce read bloquant.

    Bon j'ai ptet une soluce : la base temps.

    le client envoie au serv sa base de temps (vous savez le truc qui début le 1 er Janvier 1970 jusqu'à maintenant).
    le serveur prend la sienne. Se donne un temps t en seconde avant le départ, il ajoute ce t à la base de temps cliente et lui renvois (t+1 à la limite histoire d'avoir une seconde de ratard sur le client)
    le client compare donc ce temps avec sa base...lorsqu'elle sont égale il envoie le paquets. et là on aura une synchro pas trop pourrie (j'ai testé c'est assez fiable) puisque le serv lui aura lancé sa procédure sleep+read non bloquant à sa_base_de_temps+t.

    Bon je pense que ce sera suffisant pour le moment comem synchro. Ce n'est pas un critère fort pour mon prog. Cependant je pense quand même me renseigner sur des méthodes beaucoup plus éfficace par la suite.


    Donc bon a priori tout ça devrait fonctionner sans pb.

  4. #4
    m@
    m@ est déconnecté
    Membre actif
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Points : 292
    Points
    292
    Par défaut
    ta méthode peut en effet marcher, à condition qu'il n'y est pas d'engorgement.

    mais moi quand je parlais de read bloqant, je pensais, à la place de tous les reads non bloquants

    si le reab bloquant reste bloqué indéfiniment tu fais cmt
    pkoi serait-ce le cas ?
    Si vous fermez la porte à toutes les erreurs, la vérité restera dehors. (Tagore)

    Mandrake 10.1 up to date
    OpenBSD 3.5
    Win XP SP 2

Discussions similaires

  1. Synchronisation BDD Client/Serveur
    Par kevindeta dans le forum C#
    Réponses: 9
    Dernier message: 09/01/2012, 15h03
  2. Réponses: 3
    Dernier message: 19/07/2006, 10h38
  3. synchronisation client serveur
    Par mencaglia dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2005, 12h10
  4. comment gerer plusieurs connexions client/serveur
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/08/2002, 16h58
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 15h46

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