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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 52
    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 149
    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 149
    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