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 :

Probleme de calcule dans une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut Probleme de calcule dans une fonction
    Bonjour ... merci deja de lire mon problème ...

    Alors voila je vous explique, je dois réaliser le calcule d'un checksum et donc pour ca j'ai créé une fonction pour le faire.
    Vous allez me demander "Calculer un checksum sur quoi?" ... Et bien calculer le checksum sur un "paquet" que j'ai recu par le protocole TCP ! pour voir si le checksum que je calcule correspond bien au checksum present dans le paquet (qui a été calculer par l'envoyeur du "paquet") ... Bon j'espere que les aboutissent auront bien été expliqué ...

    Alors voici la fonction de calcule de checksum:
    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
     
    unsigned short checksum(unsigned short *addr, int len){
     
      int nleft = len;
      unsigned short *w = addr;
      int sum = 0;
      unsigned short answer = 0;
     
      // Somme des données pris deux par deux.
      while (nleft > 1) {    
        sum += *w;
        w++;
        nleft -= 2;
      }
      // Calcule du complément à 1 sur 16bits.
      answer = ~sum;
      // Envoie de la valeur du checksum calculé.
      return (answer);
    }
    Voici l'appelle a la fonction checksum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    checksum((unsigned short *)packet, packet->lenght);
    Et voici la structure du paquet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct packetRec{
      char control;
      char lenght;
      unsigned short checksum;
      unsigned short id;
      char *data;    
    };
    ainsi que ca déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Creation du pointeur
    struct packetRec *packet;    
    // Allocation de la taille.
    packet = malloc(sizeof(struct packetRec));
    packet->data = malloc(((recbuf[1])-6));    
    // Mise à zero.
    memset(packet, 0x0, sizeof(struct packetRec));
    memcpy((void*)packet, (const void*)recbuf, nbCaractere);
    (recbuf étant le buffer de reception de la fonction recv(); )

    Voici un exemple de paquet que je recois (7773 correspond au checksum)
    Receive: 2 94 7773 1 1 2 F9EC FA0E 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 98 FFF4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


    Alors voila, le probleme est que ca fonctionne pour des petits paquets ... Dans le sens ou il ne depasse pas 14Bytes ... Mais une fois que le paquet est plus gros CAD 148Bytes et bien le checksum ne retrouve pas la valeur calculer de l'autre cote (qui est la bonne ... Puisque je l'ai calculer a la main) ... J'ai affiché la valeur que j'obtenais et donc j'obtien FFFF (65535) ...

    Et donc voila ... Je me demandais si vous sauriez d'ou vient le probleme ... j'espere avoir été clair et conci dans l'explication de mon probleme ...


    Merci d'avance.

  2. #2
    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
    1. La checksum n'est-elle pas supposée être limitée aux data ?
    2. Fais gaffe à l'endianness de la checksum que tu calcules...
    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.

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Non le checksum porte sur tout le paquet (pour pouvoir verifier son integrité a la reception) ... Je ne construit pas un paquet TCP mais juste les données que je vais inclure dans la trame TCP ...

    Et oui j'ai fais attention aux indiens ^^ ...

    De plus ca fonctionne pour les petit paquet mais pas pour les gros ...
    La preuve :
    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
     
    Calculé	Recu
    62442	62442
    62445	62445
    62444	62444
    62443	62443
    62442	62442
    61340	61340
    62433	62433
    59162	59162
    32437	32437
    40575	40575
    62435	62435
    62434	62434
    62433	62433
    62432	62432
    65535	30579 <--- Correspond au calcule du checksum du plus gros paquet

    Pour info voici aussi la declaration de recbuf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define SIZEBUFFERR 160
    char recbuf[SIZEBUFFERR];

  4. #4
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    question peut-être bête mais qui vaut le coup d'être posée : n'as-tu pas un problème de dépassement de la plus grande valeur pouvant être codée sur un unsigned short ? Remplace les "short" par des "long" pour voir.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Pour le retour du checksum(unsigned short answer) ? Justement le but est de reduire la valeur de la somme (int donc 32bits) dans un unsigned short (16bits) ... Donc c'est sur que ca va depasser mais ce n'est pas grave ... enfin du moin je pense

    Sinon si c'est pas pour checksum tu parlais de quoi ?

  6. #6
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Pas d'autre suggestion ?

Discussions similaires

  1. [XL-2010] Modifier application.calculation dans une fonction ?
    Par zanimox dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/10/2013, 15h17
  2. [MySQL] Probleme de variable dans une fonction
    Par termi78 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/05/2012, 17h03
  3. Probleme de comptage dans une fonction
    Par kev484 dans le forum Débuter
    Réponses: 4
    Dernier message: 18/09/2008, 12h57
  4. Réponses: 6
    Dernier message: 24/11/2007, 18h48
  5. Probleme valeur de parametre dans une fonction
    Par TitouLolo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/05/2005, 13h56

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