|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
Bonjour
J'essaie de connaitre la taille de ma matrice de structure pour l'envoyer, seulement, je ne recois pas toute les données. Voici les éléments : Code :
|
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() |
send() et recv() retournent le nombre d'octets envoyés/reçus. Il peut être nécessaire d'appeler recv() en boucle.
__________________
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. |
|
|
10
|
|
|
#3 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
C'est pas déjà ce que j'ai fait ?
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() |
Pas correctement. Tu dois calculer la taille totale de ton envoi, et appeler recv() en boucle en comptant les tailles reçues jusqu'à tout avoir reçu.
__________________
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. |
|
|
20
|
|
|
#5 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
Hummm je vois pas très bien comment procéder :/
Pour moi j'avais fait un code correct avec ce que j'avais lu |
|
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() |
Ce qu'il faut savoir, c'est que recv() peut recevoir moins que la taille que tu lui passes en paramètre.
PS: Pour ton tableau 2D, si ses dimensions sont fixes, je te conseille de l'allouer avec une telle fontion à la place: Comme ça, tu auras un tableau d'un seul tenant dont tu pourras te servir comme d'un seul buffer pour tes appels à recv() en boucle.
__________________
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. |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
Si j'ai bien comprit.
Je passe ma matrice de structure(en pointeur) en statique dans un tableau a 2 dimensions. J'envoie mon tableau, je recois le tableau a 2 dimensions et je le remet dans ma matrice de structure en pointeur c'est ca ? Edit : J'ai vu qu'il fallait faire de la serialisation de donnée. En gros il faudrait que j'envoie chacune des valeurs de ma structure une par une pour chacune des dimensions ? |
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() |
Je n'ai jamais parlé de tableau à deux dimensions statique. J'ai seulement parlé de tableau à deux dimensions d'un seul bloc, avec une allocation par dimension au lieu de N+1 allocations.
Ensuite, tes structures n'ont pas vraiment besoin d'être sérialisées vue leur simplicité. Et même s'il fallait les sérialiser, il serait mieux de les sérialiser vers un buffer mémoire que tu enverrais ensuite avec les mêmes considérations de boucle que j'ai déjà soulevées.
__________________
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. |
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
Oui mais du coup avec ta fonction, ca va me faire changer tout le code ?
Du moins j'ai essayé avec ton code de l'adapté à l'initialisation de ma matrice, compilation ok mais lors de l'exécution ca ne fonctionne pas. Surtout que si la taille de ma matrice est variable ton système ne serait pas approprié ? Tu aurais un exemple d'envoi de structure à plusieurs dimensions ? ^^ Pour l'instant je pense qu'à mon niveau la sérialisation serait plus approprié : J'envoie en gros tout mes entiers un par un, je met un symbole comme séparation de ligne, un symbole comme séparation de colonne ainsi qu'un symbole de séparation pour définir la fin de mon envoi et voilà |
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() |
Normalement, si les dimensions de ton tableau 2D ne changent pas une fois alloué, changer la fonction d'allocation ne t'obligera pas à changer grand-chose (juste l'allocation et la suppression, et le redimensionnement s'il y en a).
Par contre, cela permettra de changer le code d'envoi/réception plus facilement vu que la matrice de structures sera continue. Si tu sérialises, évite d'envoyer tout un par un, c'est désastreux pour les performances. Si tu sérialises, ce doit donc être vers un buffer. Mais vu que tes structures ne contiennent que des entiers, si tu mets tout dans un tableau continu, tu n'auras pas besoin de sérialiser. Normalement, pour le code d'allocation, tu as juste à remplacer double par t_motte, puis passer elmax et ecmax en paramètre de la fonction. Ensuite, l'accès aux structures individuelles se fait de la même façon qu'avant, puisque tu as toujours un tableau de pointeurs sur des tableaux. Et si tu veux envoyer tout, il te suffit d'envoyer &(pMotte[0][0]) avec comme taille ecmax*elmax*sizeof(t_motte). Ceci n'est possible que si tu utilises la fonction pour que ton tableau soit continu.
__________________
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. |
|
|
10
|
|
|
#11 | ||||||
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
Très bien je vais réessayer ça.
En tout cas, merci de m'aider J'avais fait ca en sérialisation : Code :
Edit, bon la compilation et l'exécution sont passé, j'ai enlevé un de mes asserts, cependant à l'affichage, j'ai des données non cohérentes Plus quelque chose comme ca pour la sérialisation ? Serveur : Code :
Code :
|
||||||
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
Bon au final, ayant un peu réfléchi, chaque élément contient 4 entiers (de taille 4octets) donc 4*4 = 16 octets. J'envoie une ligne entière de cmax colonne donc j'ai la taille avec cmax*16 et j'ai toute ma matrice.
C'est correct ? |
|
|
00
|
|
|
#13 | |||
|
Expert Confirmé Sénior
![]() |
Déjà la taille ce sera cmax*sizeof(t_motte) et non pas cmax*16, ensuite souviens-toi de ce que j'ai dit sur les considérations de taille.
Citation:
Code C :
__________________
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. |
|||
|
|
10
|
|
|
#14 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 14 ![]() |
Bon au final tout marche impeccable avec les tailles que tu m'as dis, j'arrive à envoyer et recevoir les données entre client serveur.
Il me reste à jeter un coup d’œil sur les threads pour terminer la connexion client si le serveur ferme la connexion parce que un while(1) c'est pas top Merci pour ton aide en tout cas de m'avoir éclairer sur les tailles d'envoi et de réception : je verrais ca qu'en L3 mais bon, c'est histoire d'avoir une bonne note en projet ! |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com