C winapi, envoi structure contenant char*
Résolu
Winapi
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Salut la compagnie.
Je développe une appli en C avec la WINAPI pour envoyer des images à un client.
Je dois envoyer 2 éléments. Le header de l'image, et l'image.
l'image étant contenue dans un char* je dois donc en plus, envoyer la taille du tableau.
Donc:
- Header
- TailleImage
- Image (char*) de TailleImage octets
ce qui fait donc 3 send(), un pour le header, le taille et l'image.
J'aimerais faire quelque chose de plus propre, c'est à dire, une structure contenant ces 3 éléments, et envoyer la structure c'est possible?
Biensur je devrais envoyer la taille de la structure puisque le char* représentant l'image varie. Le truc c'est que je doit souvent envoyer soit une image (3 éléments à envoyer)
soit différents trucs (4, 5, 6 élement à envoyer).
Donc j'aimerais normaliser le tout à 2 envois. La taille de la structure ET la structure.
Est-ce possible?
Pour mon image, j'initialise ma structure, ensuite je la remplie, je met le header, je met la taille de l'image, j'alloue le char* à la taille de l'image.
et j'ai donc comme taille: sizeof(MaStructure) + maStructure.TailleImage
Mais ensuite comment envoyer le tout en socket? ca n'ira pas :/
Merci et profitez de cette belle journée:)
Je développe une appli en C avec la WINAPI pour envoyer des images à un client.
Je dois envoyer 2 éléments. Le header de l'image, et l'image.
l'image étant contenue dans un char* je dois donc en plus, envoyer la taille du tableau.
Donc:
- Header
- TailleImage
- Image (char*) de TailleImage octets
ce qui fait donc 3 send(), un pour le header, le taille et l'image.
J'aimerais faire quelque chose de plus propre, c'est à dire, une structure contenant ces 3 éléments, et envoyer la structure c'est possible?
Biensur je devrais envoyer la taille de la structure puisque le char* représentant l'image varie. Le truc c'est que je doit souvent envoyer soit une image (3 éléments à envoyer)
soit différents trucs (4, 5, 6 élement à envoyer).
Donc j'aimerais normaliser le tout à 2 envois. La taille de la structure ET la structure.
Est-ce possible?
Pour mon image, j'initialise ma structure, ensuite je la remplie, je met le header, je met la taille de l'image, j'alloue le char* à la taille de l'image.
et j'ai donc comme taille: sizeof(MaStructure) + maStructure.TailleImage
Mais ensuite comment envoyer le tout en socket? ca n'ira pas :/
Merci et profitez de cette belle journée:)
A voir également:
- C winapi, envoi structure contenant char*
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Programmer envoi sms - Guide
- Envoi impossible messenger - Forum Facebook Messenger
- Programmer envoi mail gmail - Guide
- Dans la table des matières du document à télécharger, le chapitre 6 et ses 2 sections n'apparaissent pas. trouvez l'erreur dans la structure du document et corrigez-la. mettez à jour la table des matières. quel est le mot formé par les lettres en majuscules de la table des matières après sa mise à jour ? - Forum Word
5 réponses
oui biensur désolé par socket^^ en faites je fais:
send(socket, (char*)&header, sizeof(BITMAPINFOHEADER), 0);
send(socket, (char*)&TailleImage, sizeof(int), 0);
send(socket, bitmap, TailleImage, 0);
j'aimerais juste remplir ma structure puis faire
send(socket, (char*)&TailleStructureAvecLeCharAlloue, sizeof(int), 0);
send(socjet, (char*)&structure, TailleStructureAvecLeCharAlloue, 0);
Voyez?^^
send(socket, (char*)&header, sizeof(BITMAPINFOHEADER), 0);
send(socket, (char*)&TailleImage, sizeof(int), 0);
send(socket, bitmap, TailleImage, 0);
j'aimerais juste remplir ma structure puis faire
send(socket, (char*)&TailleStructureAvecLeCharAlloue, sizeof(int), 0);
send(socjet, (char*)&structure, TailleStructureAvecLeCharAlloue, 0);
Voyez?^^
impossible de tout envoyer dans une structure si tu ne connais pas la taille à l'avance.
Send effectue une opération simple, il prend ton pointeur et envoi tout les octets jusqu'à atteindre la taille donnée. Si tu utilises une structure avec un pointeur, la mémoire n'est pas continue et donc send ne sera pas où chercher. Tu peux donc faire en deux envoie : l'en-tête et la taille de l'image.
Néanmoins, il existe peut être une solution. Je crois (à vérifier et tester) qu'il est possible de déclarer une structure de taille variable si le DERNIER argument est un tableau :
en tout cas, je me rappel d'une astuce comme ça.
Send effectue une opération simple, il prend ton pointeur et envoi tout les octets jusqu'à atteindre la taille donnée. Si tu utilises une structure avec un pointeur, la mémoire n'est pas continue et donc send ne sera pas où chercher. Tu peux donc faire en deux envoie : l'en-tête et la taille de l'image.
Néanmoins, il existe peut être une solution. Je crois (à vérifier et tester) qu'il est possible de déclarer une structure de taille variable si le DERNIER argument est un tableau :
struct conteneur { BITMAPINFOHEADER h; int TailleImage; char bitmap[]; }Ce n'est peut être pas très portable non plus... et je ne suis pas sur que tu puisse utiliser le sizeof (je pense même plutôt non). ensuite, tu fais :
send(socket,(&)conteneur,sizeof(BITMAPINFOHEADER)+sizeof(int)+TailleImage,0)
en tout cas, je me rappel d'une astuce comme ça.
Une solution similaire approuvé par un utilisateur :
https://www.generation-nt.com/reponses/les-structures-a-taille-variables-sont-elles-portables-entraide-237264.html
Il y a portabilité aussi entre les différents windows et compilateur (et même entre version de compilateur) dès l'instant que tu fait quelque chose qui n'est pas standard, il peut y avoir des soucis de portabilité.
https://www.generation-nt.com/reponses/les-structures-a-taille-variables-sont-elles-portables-entraide-237264.html
Il y a portabilité aussi entre les différents windows et compilateur (et même entre version de compilateur) dès l'instant que tu fait quelque chose qui n'est pas standard, il peut y avoir des soucis de portabilité.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci
Ben c'est exactement ce que je souhaitais faire en faite mais j'avais un gros doute.
Je connais la taille a l'avance pas de soucis^^ et la portabilité, l'applu est only windows donc pas de problème non plus.
Après au niveau propreté quel est le mieux?
Je trouve pas ca très professionnel de devoir envoyer les trucs un par un en faites.
mais sinon merci je clos^^
Ben c'est exactement ce que je souhaitais faire en faite mais j'avais un gros doute.
Je connais la taille a l'avance pas de soucis^^ et la portabilité, l'applu est only windows donc pas de problème non plus.
Après au niveau propreté quel est le mieux?
Je trouve pas ca très professionnel de devoir envoyer les trucs un par un en faites.
mais sinon merci je clos^^