C winapi, envoi structure contenant char*

Résolu/Fermé
Winapi - 29 juin 2010 à 14:56
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 30 juin 2010 à 08:06
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:)


5 réponses

Salut, c'est quoi que tu appelles "envoyer" ? par socket ?
0
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?^^
0
permettez un petit up ? :/ ca sera mon unique merci^^
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 juin 2010 à 16:57
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 :
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.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
30 juin 2010 à 08:06
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é.
0

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^^
0