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 :

[Réseau] CRC trame UDP (Prise de tête)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut [Réseau] CRC trame UDP (Prise de tête)
    Bonjour à tous,

    Alors voilà je fais de la redirection de trame. Le problème est que lorsque je change l'ip de destination du cou le CRC doit aussi changer cependant je n'arrive pas à le recalculer il me manque quelque chose donc voici les étapes que je réalise :

    1) Capture de la trame :

    FF FF FF FF FF FF 00 16 E6 5A 5F 94 08 00 45 00
    00 5C 60 E7 00 00 80 11
    00 00 C0 A8 00 E9 C0 A8
    00 65
    22 B9 22 B9 00 48 00 00
    FF FF 00 01 00 40
    EC C3 00 00 00 00 0C FF 00 00 00 00 00 34 0D 24
    34 7C 40 B8 18 FA 66 00 00 00 E4 6C 1D DA DD 00
    35 7C 00 00 00 00 01 00 00 00 FF FF FF FF FF FF
    FF FF 00 00 00 00 01 00 00 00

    En rouge est le header IP (d'aprés ethereal)
    En orange le CRC du header IP(d'aprés ethereal)
    En bleu est le header UDP (Toujours d'aprés ethereal)
    En vert le CRC du header UDP (Toujours d'aprés ethereal)


    2) Fonction utilisé pour calculer le CRC:

    unsigned short CRC(unsigned short *data, int taille)
    {
    unsigned long checksum=0;
    while(taille>1)
    {
    checksum=checksum+*data++;
    taille=taille-sizeof(unsigned short);
    }

    if(taille)
    checksum=checksum+*(unsigned char*)data;

    checksum=(checksum>>16)+(checksum&0xffff);
    checksum=checksum+(checksum>>16);

    return (unsigned short)(~checksum);
    }

    Cette fonction est donné sur de nombreux site donc je ne doute pas de sont résultat ! (J'ai fait un simple copié collé)

    3) Comment je calcul (C'est là ou doit être l'erreur )

    Dans un premier temps je met les CRC à 0 comme indiqué par la RFC (Dans la trame données je les est mis à 0)
    Puis ensuite j'appelle ma fonction comme ceci :
    CRC(Trame + 14, 20) //Trame + 14 pour avoir le header ip
    // 20 Parce que mon header est de 20
    Et là la fonction me retourne un résultat qui n'est pas celui de ethereal ...

    Ou est mon erreur ?

    Merci d'avance et horriblement désolé pour les fautes d'orthographe ...

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Déjà... tout dépend du protocol...
    ICMP calcule le CRC sur l'ensemble du packet, alors que IP ne le fait que sur l'en-tête.

    Voici ma propre fonction de calcul (choppée je sais plus ou):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    uint16 crc (const uint16* addr, int count)
    {
        uint32 sum = 0;
        while( count > 1 ) {
             sum += *addr++;
             count -= 2;
        }
        if (count)
             sum += * (uint8 *) addr;
        while (sum>>16)
             sum = (sum & 0xffff) + (sum >> 16);
        return (uint16) ~sum;
    }
    Ca ressemble fortement à ta fonction (à part l'utilisation des 'short'... attention si short ne fait pas 2 bytes... ta fonction ne marche plus).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Salut,

    Je te remercie de ta réponse,

    Alors ta fonction retourne la même chose que la mienne je viens de la tester et mes unsigned short font bien 2 octets je les aussi vérifié

    Aussi je n'utilise pas le protocole ICMP mais UDP.

    Enfin d'aprés mon exemple comment puis je calculer ce que j'ai mi en ORANGE ?

    Car biensur ça ne marche pas plus maintenant que hier malgrés mes recherches sur le net :s

    Encore merci !

Discussions similaires

  1. Taille d'une trame UDP.
    Par LinuxUser dans le forum Réseau
    Réponses: 15
    Dernier message: 30/11/2008, 15h21
  2. Réponses: 2
    Dernier message: 13/06/2008, 07h58
  3. analyser des trames udp
    Par szambaux dans le forum Débuter
    Réponses: 1
    Dernier message: 27/04/2008, 14h27
  4. Multicast : Bloquer les trames UDP en JAVA
    Par daron dans le forum Développement
    Réponses: 3
    Dernier message: 18/09/2006, 14h22
  5. Problème de récéption ou d'envoi de Trame UDP
    Par sniperseb dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 10/04/2006, 23h11

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