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)); }
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