IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

R�seau C Discussion :

[pointeur ou pas?] transmettre une structure via une socket


Sujet :

R�seau C

  1. #1
    Membre chevronn�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Juin 2016
    Messages
    278
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 278
    Par d�faut [pointeur ou pas?] transmettre une structure via une socket
    Messieurs, Dames ("les mecs", quoi),

    Je dois transmettre une stucture (une "struct" au sens de C, bien �videmment) via une socket, et j'ai vu partout sur d'autres forum "qu'il faut s�rialiser la structure, car simplement transmettre un pointeur dessus revient � copier une adresse m�moire qui n'aura pas de sens pour la machine receveuse".

    Or j'ai test� d'envoyer un pointeur sur ma structure et j'ai quand m�me l'impression que l'on transmet une "copie profonde" de la structure (j'ai l'impression de bien transmettre par copie et non par valeur).

    Je vous mets le code client:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    struct trame trametest;
    trametest.Struct_Size = 25;
    char * test = (char *)&trametest;
    //tout le bordel de configuration de la socket, je passe
    //puis:
    send(sock ,test, sizeof(trametest) , 0 );
    le code serveur:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    struct trame trametest;
    valread = read( new_socket , buffer, sizeof(trametest));
    trame *test = (trame *)buffer;
    J'ai beau afficher des adresses dans tous les sens, je ne trouve aucune adresse commune, comme si je n'avais pas transmis ma structure par r�f�rence, mais par valeur...

    Qu'en pensez-vous?

    cordialement

  2. #2
    Membre �m�rite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par d�faut
    Bonjour,
    tu donnes l'adresse d'une structure ainsi que sa taille � send qui va transmettre les sizeof(trametest) byte situ�s � l'adresse &trametest. Tu ne transmets pas un pointeur mais une suite d'octets en sp�cifiant leur nombre et leur position en m�moire : c'est pas pareil.

    Si tu structure ne contient que des type valeurs pas de soucis (mais bon lis plus loin si client et serveur ne sont pas compil� avec les m�me options avec le m�me environnement sur la m�me plateforme), si en revanche elle contient des pointeurs, ce seront les valeurs des pointeurs qui seront copi�es et non ce qui est point�.

    Maintenant attention, si le client et le serveur sont sur des machines ou os diff�rents il peut y avoir des probl�mes de tailles. Par exemple un long fera 32 bits en Win64/msvc et 64 bits sur linux, mac 64 et m�me win64/mingw. Au pire tu aura m�me des probl�mes d'endianess. Ensuite tu auras sans doute aussi des probl�me de struct packing (une m�me structure peut ne pas avoir la m�me taille et layout suivant les options de compilations, les plateformes, etc �

    Le plus simple est effectivement de s�rialiser en utilisant un protocole simple, puis d�s�rialiser suivant le m�me protocole de l'autre c�t� ; tant qu'� faire un protocole human readable pour le d�bug est toujours plus simple.

  3. #3
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 154
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 154
    Billets dans le blog
    4
    Par d�faut
    et read ne lit pas forc�ment toutes les donn�es, si la taille demand�e est un peu grande �a s'arr�tera avant
    pour �a il faut cr�er son propre protocole

    J'ai beau afficher des adresses dans tous les sens, je ne trouve aucune adresse commune, comme si je n'avais pas transmis ma structure par r�f�rence, mais par valeur...
    je vois pas trop ce que tu esp�res retrouver ni ce que tu appelle transmettre par r�f�rence...
    send �a envoit une suite d'octets tel quel, c'est tout.
    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.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Reception d'une structure via un socket en java
    Par mlboua dans le forum Entr�e/Sortie
    R�ponses: 1
    Dernier message: 01/05/2014, 15h59
  2. ServerSocket ne communique pas avec une socket cliente
    Par jrem76 dans le forum Entr�e/Sortie
    R�ponses: 0
    Dernier message: 19/04/2013, 16h35
  3. R�ponses: 6
    Dernier message: 12/09/2007, 15h58
  4. R�ponses: 16
    Dernier message: 24/09/2006, 21h11
  5. Transmettre une variable via un lien href
    Par developpeur_mehdi dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 6
    Dernier message: 08/01/2005, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo