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

Réseau C Discussion :

Calcul CRC d'une trame


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut Calcul CRC d'une trame
    Bonjour,

    Je dois calculer le CRC d'une trame, représenté par une structure dans mon programme, que j'envois à un server sur l'adresse loopback.
    Le problème est que j'ai une segmentation fault ou si je fais un petit changement, le CRC n'est jamais a 0 pour une trame non endommagée.

    Code
    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
    18
    19
    20
    21
    22
    23
    24
     
    unsigned short cksum(void *ipt, int len)
    {
      long sum = 0;
      unsigned short *ip;
      ip = ipt;
     
      while(len > 1)  
      {
        sum += *(ip)++;
        if(sum & 0x80000000)
        {
           sum = (sum & 0xFFFF) + (sum >> 16);
           len -= 2;
         }
      }
     
      if(len)
        sum += (unsigned short) *(unsigned char *) ip;
      while(sum >> 16)
        sum = (sum & 0xFFFF) + (sum >> 16);
     
      return ~sum;
    }
    Si je laisse le code tel quel, le programme s'arrête avec un beau Segmentation Fault.
    Par contre si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (unsigned short *)ip++;
    la je n'ai plus ce problème mais si je calcule 2 fois le crc il doit être a 0 à la seconde fois et il ne l'est pas.
    J'initialise à 0 un champ CRC dans ma structure et je développe sous Linux Mandriva 2007.

    Merci

    Bonne soirée

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Euh, c'est quoi comme type de données ? C'est stocké dans un buffer de char ?

    Et tu as un paramètre qui a le même nom qu'une de tes variables.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et en plus ce serait pas mal, dans un code comme ça, de mettre des petits commentaire avant chaque bloc.....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Les données sont stocké dans une structure que je passe en paramètre à la fonction cksum(&structure, sizeof(struct Data));.
    Pour la variable qui a le même nom, c'est une faute de frappe

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    euh!!!

    ta fonction est un unsigned short et tu retournes un long (sum ou ~sum).....

    En plus ton "ip = ipt" marche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ip = (unsigned short)ipt ;
    ;

    et tu modifies len, alors que tu n'as pas passé un pointeur, mais la valeur...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Dimitri_87
    Je dois calculer le CRC d'une trame,
    CRC vraiment ? Ce que j'ai vu ressemble à un checksum 16-bit horriblement compliqué et que je ferais comme ça :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <stdio.h>
     
    #define DBG 1
     
    int cksum16 (void const *p, size_t len)
    {
       /* per defaut : erreur */
       int cs = -1;
     
       /* parite paire ? */
       if ((len & 1) == 0)
       {
          /* acceder aux donnees en mode byte */
          unsigned char const *po = p;
          unsigned i;
     
          /* initialisation du CS */
          cs = 0;
     
          for (i = 0; i < len; i += 2)
          {
             /* convention reseau : MSB en tete */
             unsigned n = 0;
             n |= (po[i + 0] & 0xFF) << (8 * 1); /* MSB */
             n |= (po[i + 1] & 0xFF) << (8 * 0); /* LSB */
     
    #if DBG
             printf ("po[%u+0]=%d po[%u+1]=%d\n", i, po[i + 0], i, po[i + 1]);
    #endif
     
             cs += n;
     
    #if DBG
             printf ("n=%04X cs=%04x\n", n, cs);
    #endif
          }
          /* complement a 1 sur 16 bits */
          cs = ~cs & 0xFFFF;
       }
       return cs;
    }
     
    int main (void)
    {
       unsigned char data[20] = { 1, 2, 3, 4, 5, 6, 7, 8 };
     
       int cs = cksum16 (data, 8);
     
       if (cs != -1)
       {
          printf ("cs = %04X\n", cs);
       }
       else
       {
          puts ("cs error");
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    po[0+0]=1 po[0+1]=2
    n=0102 cs=0102
    po[2+0]=3 po[2+1]=4
    n=0304 cs=0406
    po[4+0]=5 po[4+1]=6
    n=0506 cs=090c
    po[6+0]=7 po[6+1]=8
    n=0708 cs=1014
    cs = EFEB
     
    Press ENTER to continue.
    Si tu veux réellement un CRC, il faut donner la spécification exacte... (CRC4, CRC8, CRC16 etc.)
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Sur ma feuille il est marqué CRC maintenant ce n'est pas moi qui ai fait le code, il m'a été fournit, je dois juste l'utiliser dans mon applic.
    En fait il faudrait juste que ce CRC ou Checksum, me calcule une taille pour mon client et qu'a la réception du paquet par le server, il le recalcule pour voir si la trame est endommagée donc si le checksum vaut 0 = trame non endommagée

Discussions similaires

  1. Calcul du crc d'une trame
    Par Mirounette dans le forum C++
    Réponses: 1
    Dernier message: 27/04/2012, 07h46
  2. calcul de CRC pour une image png
    Par floopi51 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 15/01/2009, 08h35
  3. calcul de CRC pour une image png
    Par floopi51 dans le forum Débuter
    Réponses: 7
    Dernier message: 15/01/2009, 08h32
  4. Calcul du SNR à partir d'une trame 802.11
    Par Kingdomofh dans le forum Développement
    Réponses: 2
    Dernier message: 12/03/2007, 08h45
  5. besoin d'un avis sur le calcul msb et lsb d'une trame
    Par thony76 dans le forum Visual C++
    Réponses: 10
    Dernier message: 03/08/2006, 13h20

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