Si le serveur sérialise et désérialise déjà correctement, tu n'auras pas besoin de le modifier (donc ce n'est pas grave si tu ne peux pas).
Si le serveur sérialise et désérialise déjà correctement, tu n'auras pas besoin de le modifier (donc ce n'est pas grave si tu ne peux pas).
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.
Hé bien je ne sais pas trop ce que fais le serveur ... Tout ce que je sais c'est que pour l'instant le code est réalisé en Automation Basic ...
Concernant le refactoring du code ... Compte tu faire tout le code ? Ou m'as tu montré un exemple pour que je puisse continuer a faire le reste ? Parce que j'ai vu que tu as utilisé des define ... Donc je supose que tu as commencé a modifié tout le code ... Donc voila ... Je ne sais pas quoi ! Merci de ta réponse ... J'vais commencer quand meme a chipoter a ca histoire de pouvoir rentrer dans la sérialization !
Merci encore pour tout !
Je suis en train de bosser sur pratiquement tout le code que tu m'as passé.
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.
Pas de Wi-Fi à la maison : CPL
Voici le code avec mes corrections (Edit: Supprimé, code corrigé dans le message #132).
Je te préviens, ça compile, ça linke, mais je n'ai fait aucun test. Pas même des tests unitaires.
Mais ce code corrigé devrait être plus maintenable que le code d'origine.
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.
Et bien ... C'est un sacré lifting ... J'ai du mal a voir s'il reste une ligne de code qui vient de moi ...
Je vais me plonger dans le code pour essayé de le comprendre ... Si jamais j'ai des questions tu restes abonnés a ce topic ? Histoire que je ne parle pas dans le vide ...
Mais en tout cas, c'est vraiment gentil a toi de m'avoir donné un coup de pouce ...
Concernant les test avec l'automate, je te dis quoi dés que j'ai compilé et pu tester !
Bonjour ... Déjà j'ai un ptit probleme a la compilation ... Il m'indique que la variable oldIndex n'est pas déclaré (‘oldIndex’ undeclared ) ... Par ailleur elle est déclarée mais entre un ifdef et endif ...
Et comme j'ai encore un peu de mal avec cette partie de serialization ... Je ne sais pas trop comment faire :s...
Bon j'ai mis les ifdef et endif en commentaire ... La compilation s'effectue ... Je lance le soft et il me sort : calcule checksum pas bon ... :'( sniff sniff ... Alors je me dis que maintenant avec la serialization et la deserialization, que l'automate de l'autre coté, calcule mal son checksum ... :s hors cela fonctionnait sous windows
Quel galère :'(
J'ai aussi un peu de mal avec cette partie la ... C'est pour tester si le nombre de caractere recu correspond bien a la taille indiquée dans le paquet ... CAD le tableau ?
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 int taille_a_recevoir = 2; int taille_recue = 0; int bRecuTaille = 0; /*Booléen*/ do{ int cbRecu = recv(pAppStatus->clientSock, (char*)&recbuf[taille_recue], MAXSIZEPACKET-taille_recue, 0); if(cbRecu < 0){ taille_recue = SOCKET_ERROR; break; } taille_recue += cbRecu; if(!bRecuTaille && taille_recue >= taille_a_recevoir){ char byTaille = recbuf[1]; /*Octet de longueur*/ if(byTaille < NETSIZE_OF_packetRec_HEADER){ taille_recue = SOCKET_ERROR; break; } taille_a_recevoir = byTaille; bRecuTaille = 1; } } while(taille_recue < taille_a_recevoir);
Hum ... Je me pose des questions au niveau du calcul du checksum :
Comment fait la boucle pour se deplacer ? Alors que l'on ne decremente pas le cbLen et que l'on ne fait pas varier w pour se deplacer dans la mémoire ?
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 unsigned short checksum16(void const *addr, size_t cbLen){ size_t index = 0; unsigned short w; unsigned short sum = 0; unsigned short answer = 0; assert(addr != NULL); // Somme des données pris deux par deux. while(index < cbLen){ Deserialize_word_u(addr, &w, &index); sum = (unsigned short)(sum + w); } // Calcule du complément à 1 sur 16bits. answer = ~sum; // Envoie de la valeur du checksum calculé. return(answer); }
Alors, pour le coup des oldindex, c'est que l'assertion n'est pas définie pareil chez toi (linux+gcc) et chez moi (Windows+Visual).
Tu peux remplacer les #ifdef _DEBUG par des #ifndef NDEBUG, qui me semble-t-il est le standard.
Le code avec taille_a_recevoir sert à recevoir les données par petits bouts si nécessaire: Après avoir reçu au moins deux octets, on lit la vraie taille du paquet et on attend d'avoir reçu au moins cette taille.
Le problème (qui était déjà présent dans ton ancien code, et que je ne vois que maintenant), c'est que si on reçoit plus que ce qu'on voulait, l'excédent, qui était sans doute le début d'un nouveau paquet, est perdu. Il faudrait remplacer MAXSIZEPACKET par taille_a_recevoir.
Dans le calcul du checksum, la fonction Deserialize_word_u() incrémente la variable index.
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.
J'venais de comprendre a l'instant pour la boucle du checksum
... Concernant la partie pour recevoir le paquet ... Pourquoi recuprer le paquet par petite partie si necessaire ? On ne recoit pas le paquet en entier dans la partie donnée de la trame TCP ?
Comment pourrais t'on recevoir plus ? Si dans le protocole qu'y a été défini, pour un packet envoyé, on a un paquet recu ... Avec des tailles fixes ... ?
Je viens de faire des tests pour le checksum ... Le calcule que l'on fait pour essayé de trouver la meme valeur que le checksum recu dans le paquet, n'est pas similaire ... Mais le probleme, c'est que pour le même paquet ... Il calcule un checksum différent a chaque fois :s
Voici les info's :
Paquet ecrit dans le log:
Execution numéro1
Checksum :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Receive:;12;0C;F3EA;0000;0001;0001;0001;
Execution numéro 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Checksum recu : 62442 Checksum calcule : 55896
Paquet ecrit dans le log:
Checksum :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Receive:;12;0C;F3EA;0000;0001;0001;0001;
Execution numéro 3
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Checksum recu : 62442 Checksum calcule : 35675
Paquet ecrit dans le log:
Checksum :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Receive:;12;0C;F3EA;0000;0001;0001;0001;
C'est quand même vachement bizzar .. Parce que s'il ne trouve pas la meme valeur ok ... c'est qu'il y a un bug ... Mais la il ne donne pas la meme valeur a chaque execution ce qui est encore plus bizzar ;(
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Checksum recu : 62442 Checksum calcule : 14734
Pour la réception: En mode TCP, il n'y a pas de notion de message: Il n'y a qu'une suite d'octets, et le socket ne sait pas où commence un paquet ni où fini l'autre.
Donc, un paquet peut être reçu par petit bouts, ou bien si le réseau est encombré et que deux paquets sont envoyés à la suite, ils peuvent être reçus en une seule fois...
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.
J'ai trouvé le problème du checksum: On le fait sur une structure désérialisée, donc on n'est pas réellement sûr de sa taille, en fait.
Pour que le checksum marche bien, il faudrait remettre à zéro le checksum dans le buffer et faire la checksum dessus.
...Ou bien, resérialiser le paquet une fois la checksum mise à zéro et la refaire dessus également...
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.
Oky ... Mais est ce que cela pourrait expliquer le probleme que je viens de detailler juste avant pour le checksum ? Du faite que l'on ne recupere jamais la meme chose dans le paquet .. Puisqu'il ne donne jamais la meme réponse .. Quand on voit le detail du calcule ... On voit que le debut est toujours le meme sauf a partir du moment ou il arrive sur le pointeur rawdata ...
Tiens, pour la checksum, essaie ceci à la place: La checksum est faite sur le paquet sérialisé et non sur la structure désérialisée...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // Test du checksum. { unsigned short returnChecksum; recbuf[2] = 0; recbuf[3] = 0; returnChecksum = checksum16(recbuf, taille_recue); printf("%u = %u\n", packet.checksum, returnChecksum); printf("%X - %d - %u\n", packet.control, packet.lenght, packet.id); if(packet.checksum == returnChecksum) bChecksumOK = 1; }
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.
As-tu vu mon message précédent ?
Si ça se trouve, tu étais déjà en train de taper quand j'ai posté, ce serait bète que tu le loupes...
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.
Oui je l'ai vu après avoir posté le mien ... Je viens d'essayé ton idée ! Et je suis heureux de pouvoir t'annoncer que ca fonctionne ! J'ai bien le même checksum des deux cotés ! Pfuiiii
Merciiiiiiii beaucoup encore une fois ! Je ne sais pas ce que j'aurai fais sans toi !
Gros Bizou a toi !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager