Forum Programmation.c caster en une structure

Posté par  .
Étiquettes : aucune
0
31
juil.
2006
bonjour,
je dispose d'un client et un serveur tcp et je dois envoyer une structure de données avec beaucoup de champs du client ->serveur. Alors pour cela je rempli les champs de ma struture au niveau client et je l'envoie avec la primitive send vers mon serveur. mais j'ai du mal à faire le castage en char * de ma struture du coté client comme du coté serveur. je demande de l'aide.
Merci.
  • # send

    Posté par  . Évalué à -2.

    le prototype de mon send est comme ça :
    ssize_t send(int s, const void *msg, size_t len, int flags);

    et il faut l'utiliser de cette manière je suppose :

    n = send(ta_socket, (void *)&ta_structure, sizeof(ta_structure), tes_flags);

    il n'y a pas de char* chez moi.
  • # Il faut caster le pointeur sur la structure, mais attention ...

    Posté par  . Évalué à 5.

    Il y a très longtemps que je n'ai pas fait de C, mais ça doit être quelque chose comme çà:


    mystruct m;
    mystruct m_ptr = &m;

    send(fd, (void *)m_ptr, sizeof(m), 0);


    Mais attention. Si ton client et ton serveur doivent fonctionner sur la même plateforme (même compilateurs, mêmes OS, mêmes architectures), ça doit passer (encore que ...). Sinon, tu peux avoir les problèmes suivants :

    1° octets de bourrage dans la structure. Les compilateurs peuvent placer des octets supplémentaires dans la structure, de manière non normalisée.

    Par exemple sur beaucoup d'architectures, les champs sont alignés au mot, donc si tu as un char et un long int comme champs, ta structure fera 8 octets :

    * le char
    * trois octets de remplissage
    * les quatre octets du long.

    Il y a des directives de preprocessing pour régler ce comportement.

    2° attention aux représentations des int. Selon les architectures, l'octet de poids fort et codé au début ou à la fin. Par exemple c'est différent sur Intel et sur PowerPC.

    Pour un comportement "propre", il faut avoir recours à des techniques un peu plus sophistiquées comme XDR ou beaucoup plus sophistiquées comme ASN.1.
  • # surtout pas

    Posté par  . Évalué à 4.

    Ne fait jamais de cast d'une structure pour l'envoyer en tcp!!!

    Ce n'est absolument pas portable, d'un compilateur à un autre (padding differents, alignement des données, taille des données), d'une architecture à une autre (big endian vs litle endian).

    Tu as deux choix pour envoyer à travers le réseau, tu envois tes données en mode texte (cf protocoles type http), ou tu définis correctement la taille, le prototype et l'endianness de ton protocole.
    Et tu envoit tes données avec un traitement spécial pour chaque type de données de base (celà revient à faire quelque chose de proche de l'ASN.1, mais sans avoir à l'utiliser)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.