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:
Voici l'appelle a la fonction 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); }
Et voici la structure du paquet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 checksum((unsigned short *)packet, packet->lenght);
ainsi que ca déclaration :
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; };
(recbuf étant le buffer de reception de la fonction recv(); )
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);
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.
Partager