Bonjour,
Je voulais envoyer objet std::map via socket tcp, mais toujours j'ai eu un message d'erreur : segmentation fault.
Est ce que c'est poosible d'envoyer un std::map via socket TCP!!
merci d'avance
Bonjour,
Je voulais envoyer objet std::map via socket tcp, mais toujours j'ai eu un message d'erreur : segmentation fault.
Est ce que c'est poosible d'envoyer un std::map via socket TCP!!
merci d'avance
Bonjour,
les containers de la STL, std::vector, std::map, std::list ... allouent tous de la mémoire sur le tas, c'est-à-dire que toute l'information de l'objet n'est pas strictement contenu dans l'objet lui-même. Afin de le copier dans un flux (un fichier, une socket, une plage mémoire partagée, ...) il est nécessaire de sérialiser l'objet.
Plusieurs solutions s'offrent à toi :
- utiliser les classes de sérialisation de Boost, par exemple ;
- sérialiser toi-même ta map, en envoyant chaque paire contenue séparément dans ta socket TCP et en ajoutant les paires obtenues de l'autre côté dans une map vide ;
- écrire un std::allocator pour ta map qui allouera de la mémoire de manière contigüe dans un bloc mémoire que tu maitrises et que tu pourras envoyer bêtement via TCP.
Bon courage.
Une autre solution peut être d’utiliser une sérialisation format json. Ça a l’avantage de rendre plus facile l’interopérabilité avec d’autres systèmes.
Je suis toujours circonspect avec la sérialisation boost, car à ma connaissance la stabilité du format binaire n’est pas garantie avec l’évolution en version.
J'ai choisi d'envoyer( du server) le map pair par pair, <key, data>
avez vous une idée sur comment regrouper mes donner coté client!!
en fait l'un de mes donnes c'est une image binaire de taille important
merci d'avance
?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 std::map<int, int> m; void onReceivePair(std::map<int, int>& m, int key, int value) { m.insert(std::make_pair(key, value)); }
Merci mais je pense pas que ca sera possible de seraper les données, car la taille de l'image et trop imprtant
alos si j'envoi <key0 , image>
<key1, len>....
comment je peux savoir le debut et la fin de chaque paire recu
Salut,
j'ai l'impression que tu ne sais pas du tout ce que sérialisation signifie en fait ?
Pour envoyer des data, c'est à toi de choisir le format, et d'écrire la sérialisation et déssérialisation correspondante.
Si key est une string (nom de fichier ?), tu peux mettre un entier avec la longueur de la chaine, puis la chaine, tout le reste sera le buffer de l'image.
Ce n'est qu'une idée rapide.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
En général, on met un identifiant unique permettant de savoir quelle est la structure, avant la structure elle-même. Cela permet que la lecture ne doive pas absolument savoir dans quelle ordre les données sont supposé arriver, et donc d’être plus robuste aux évolutions et aux corruptions de données.
Dans ton cas, ça pourrait être quelque chose du genre (je commence la numérotation à 1, pas d’octet 0) :
octet 1 : 12 --> 12 = identifiant pour « map » (valeur choisie totalement au pif et arbitrairement)
octet 2 : 10 --> 10 = identiant pour « int » (idem)
octets 3-6 : valeur du « int »
octet 7 : 63 --> 63 = identifiant pour « image »
octets 8-11 : taille de l’image (nombre entier)
octets 12-X :*données binaires de l’image
octet X+1 : 10 (identifiant pour int, valeurs suivante)
octets X+2 - X+5 :*valeur
...
octet Y : 13 --> 13 = terminateur de map
À la lecture, tu peux facilement reconstruire la structure à partir de ces informations.
Oui. Il est toujours possible d'utiliser memcpy avec des std::vector, mais pas directement sur l'adresse de l'opjet, mais par exemple sur l'adresse retournée par std::vector::data.
Dans un contexte où il n'est pas possible d'utiliser du C++11, l'alternative estOui. Il est toujours possible d'utiliser memcpy avec des std::vector, mais pas directement sur l'adresse de l'opjet, mais par exemple sur l'adresse retournée par std::vector::data.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::vector<T> myVec; &myVec[0];
Et json + base64![]()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 { {"key": XXX, "data": "data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA="}, {"key": XXX, "data": "data:image/jpeg;base64,9j4AAQSkZJRgABAQEAWgBaAAD4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAAB"}, {"key": XXX, "data": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA AAAFCAYAAACNbyblAAAAHElEQVQI1"} }
Tes images ne font quand même pas 10, 20, 50 Mo![]()
![]()
Partager