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 :

srand et compatibilité intra-plateforme


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut srand et compatibilité intra-plateforme
    Salut !

    J'ai affaire à un sérieux problème. C'est une plateforme client-serveur. Le client n'est plus maintenu depuis longtemps et je ne possède pas le code source. Je refais le serveur à ma convenance, cependant, j'ai un problème avec le cryptage des paquets. Ils sont cryptés à coup de srand( seed ). Je connais ce seed, il ne m'est pas envoyé de manière cryptée. Et je connais aussi tout l'algo qu'il y a derrière.

    Cependant, après moultes tests, il m'est impossible d'avoir la même séquence pseudo-aléatoire que le client. Ni sous g++, ni sous VS2008. Je sais que srand() n'est pas implémenté de la même manière sur différentes architectures/os, mais y a-t-il un moyen d'arriver à la même séquence quand même ?

    Le client a été compilé avec VS6 sous Pentium, j'essai de faire en sorte que le serveur soit pour Linux. De plus, j'ai un Core2Duo Penryn que j'utilise pour compiler, je sais pas si ça influe également.

    Est-ce réellement impossible ou je dois me débrouiller pour créer un proxy entre le client et le serveur qui aurait été compilé avec le même environnement que le client ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Bah si tu sais l'algo qu'utilise ton client, il suffit d'utiliser le même algo.
    Boost ftw

  3. #3
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Oui mais c'est un algo basé sur une séquence mathématique générée à partir de srand( seed ) puis 10 rand(). Ca donne à chaque fois la même séquence tant que la graine (seed) est la même. MAIS, cette séquence est pas la même selon que je compile sous linux ou sous windows (même différentes versions de compilateur). Et j'aimerais savoir si c'est possible de générer la même séquence peu importe le compilateur, en gros en bidouillant sur la manière de générer de manière à reproduire exactement le même environnement que celui où le client génère.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Cependant, après moultes tests, il m'est impossible d'avoir la même séquence pseudo-aléatoire que le client.
    Perso, ça ne m'étonne pas trop et je suis étonné qu'il n'y as pas eu de problème avant.

    Le seule conseil que j'aurais, et de regarder dans boost, ou créer ton générateur pseudo aléatoire. Je ne suis pas sur que les algo random de boost certifie que pour un seed donnée, la suite sera identique.

    http://fr.wikipedia.org/wiki/G%C3%A9...rithmes_connus

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Oui mais c'est un algo basé sur une séquence mathématique générée à partir de srand( seed ) puis 10 rand(). Ca donne à chaque fois la même séquence tant que la graine (seed) est la même. MAIS, cette séquence est pas la même selon que je compile sous linux ou sous windows (même différentes versions de compilateur). Et j'aimerais savoir si c'est possible de générer la même séquence peu importe le compilateur, en gros en bidouillant sur la manière de générer de manière à reproduire exactement le même environnement que celui où le client génère.
    L'algorithme utilisé pour rand() est implémentation dépendant... donc t'as aucune garantie. La seule solution est d'utilisé une bibliothéques tierces.. (boost) Maintenant si tu ne peux pas toucher à la partie server ça va être plus dur. (comme ça je vois pas comment faire).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #define SAMPLE_RAND_MAX 32767
    unsigned long randseed = 1;
     
    void samplesrand(unsigned seed) 
    {
       randseed = seed;
    }
     
    int samplerand(void)
    {
       seed = seed * 1103515245UL + 12345UL;
       return (seed /65536UL) % (SAMPLE_RAND_MAX+1UL);
    }
    C'est l'exemple donné par la norme C, repris par PJP dans The Standard C Library et si j'ai bonne mémoire, Dinkumware -- la société de PJP -- est le fournisseur de la libc utilisée par VC++6. Il y a une petite chance qu'il n'ai pas changé d'algo.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #define SAMPLE_RAND_MAX 32767
    unsigned long randseed = 1;
     
    void samplesrand(unsigned seed) 
    {
       randseed = seed;
    }
     
    int samplerand(void)
    {
       seed = seed * 1103515245UL + 12345UL;
       return (seed /65536UL) % (SAMPLE_RAND_MAX+1UL);
    }
    C'est l'exemple donné par la norme C, repris par PJP dans The Standard C Library et si j'ai bonne mémoire, Dinkumware -- la société de PJP -- est le fournisseur de la libc utilisée par VC++6. Il y a une petite chance qu'il n'ai pas changé d'algo.
    malheureusement ce n'est pas ça

    J'ai essayé de regarder le code source, et bien que RAND_MAX correspond (0x7FFF), le corps des fonctions n'est pas là... Doit être dans les .lib, et aucune idée de comment les reverse -.-

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Teste les différentes solutions données ici :
    http://en.wikipedia.org/wiki/Linear_...tial_generator
    Boost ftw

  9. #9
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    OUI !

    Merci à vous 2 !
    Ces valeurs fonctionnent très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define SAMPLE_RAND_MAX 32767
    unsigned long randseed = 1;
     
    void srand(unsigned seed) 
    {
       randseed = seed;
    }
     
    int rand(void)
    {
       randseed = randseed * 214013UL + 2531011UL;
       return (randseed / 65536UL) % (SAMPLE_RAND_MAX + 1UL);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compatibilité D5 / VNC
    Par gord's dans le forum Outils
    Réponses: 7
    Dernier message: 12/05/2004, 17h02
  2. help!! problème de compatibilité ascendante
    Par valfredr dans le forum XMLRAD
    Réponses: 5
    Dernier message: 16/06/2003, 16h15
  3. [7RC3] Compatibilité avec les anciennes versions ...
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 3
    Dernier message: 15/05/2003, 16h46
  4. Compatibilité Visibroker 4.5 C++ Builder
    Par manuel dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 21h57
  5. compatibilité des librairies directX8
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 23/05/2002, 21h33

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