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

C Discussion :

Envoi structure sur socket TCP


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Envoi structure sur socket TCP
    Bonjour,

    J'ai un un gros souci (ou petit ça dépend comment on voit les choses). Je n'arrive
    pas à envoyer une structure sur mon socket (du serveur vers le client) et
    la lire côté client.

    J'ai bien alloué l'espace mémoire de ma struture avant de lire le contenu
    de mon buffer(côte reception). Ce n'est pas un problème de bibliothèque
    non plus.

    Voici la ligne côté serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(sockPipe,(char*)&grille,sizeof(grille));
    Côté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read(descripteurSocket,(char* )&grille,sizeof(grille));
    (rq: ma structure est composé de sous-structures! Le problème viendrait -
    il de là ?).

    En fait, lorsque je debug, je me rends compte que le client affiche(cannot access memory 0xxxxxxxx).
    Je me suis tourner vers le web et j'ai trouvé plusieurs informations:

    -Apparemment la serialisation de ma structure serait plus adapté mais les
    seuls tutoriels présents sur le web sont sur les classes d'objets.
    Pourriez-vous me dirigez vers un lien ou un cour sur le sujet (c'est à
    dire "la sérialisation de structure sur un socket").

    -J'ai lu aussi qu'il fallait plus utilisé un memset de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        grille.tab= malloc(sizeof (Colonne) * grille.taille);
        memset(grille.tab,0,sizeof(Colonne));
        for (i = 0; i < grille.taille; i++) {
            grille.tab[i].colonne = malloc(sizeof (Case) * grille.taille);
            memset(grille.tab[i],0,sizeof(Case));
        }
    -J'ai pensé, aussi, au lieu d'envoyer la structure, j'enverrai les
    éléments de la structure en série. Mais le problème c'est un code assez
    lourd et je voudrais quelques choses d'optimisé.

    J'ai essayé toutes ces "solutions" mais rien ne fonctionne.


    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Si tu as des pointeurs dans ta structure, les envoyer tel quels sur le réseau n'a pas de sens puisque les adresses ne seront évidemment pas valides dans le process client. Si tu donnes tes structures on pourra peut-être te donner des idées sur la manière de les envoyer.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui j'ai des adresses dans ma structure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct CASE {
        char lettre;
    } Case;
    
    typedef struct COLONNE {
        Case* Colonne;
    } Colonne;
    
    typedef struct GRILLE {
        Colonne* tab;
        int taille;
    } Grille;
    Je voudrais envoyer sur le socket la structure grille qui est composé de toutes les autres structures.

    J'avais penser à : write(sockPipe,(char*)&grille,sizeof(grille)); ?
    Qu'est ce que vous penser ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par BlackVador Voir le message
    Qu'est ce que vous penser ?
    Que cela ne passe pas dans un socket directement, il y a des pointeurs, donc c'est pas bon.

    Il va falloir sérialiser ta structure ou faire du marshalling

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ok!Sur le net il y a des sujets sur la serialisation par contre ça concerne que des classes d'objets. J'ai cherché sur la serialisation des structures mais je ne trouve pas. Tu connaitrais pas un lien ou un tuto bien précis sur le sujet.
    Et qu'entends-tu par marshalling ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BlackVador Voir le message
    Ok!Sur le net il y a des sujets sur la serialisation par contre ça concerne que des classes d'objets. J'ai cherché sur la serialisation des structures mais je ne trouve pas.
    Une structure peut se voir comme une classe qui n'aurait aucune méthode. Et inversement une classe c'est un truc qui fait tout ce que fait une structure et qui a des méthodes en plus. Donc ce qui marche pour une classe marchera forcément pour une structure...

    Citation Envoyé par BlackVador Voir le message
    Et qu'entends-tu par marshalling ?
    Juste un synonyme...

    Citation Envoyé par BlackVador Voir le message
    -J'ai lu aussi qu'il fallait plus utilisé un memset de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        grille.tab= malloc(sizeof (Colonne) * grille.taille);
        memset(grille.tab,0,sizeof(Colonne));
    Ben oui. Comme malloc(), memset() ne travaille qu'en octets. Tu alloues "sizeof(Colonne) * grille.taille" octets et tu n'initialises que "sizeof(Colonne)" octets...
    Accessoirement calloc fait l'équivalent de "malloc + initialisation à 0"...

  7. #7
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Points : 115
    Points
    115
    Par défaut
    Bonjour,

    Tout a été dit, mais je te rappel/informe que transmettre une structure sous sa forme brute (binaire) est limité par des contraintes de portabilité (les alignements/paddings, les tailles des types, l'encodage des entiers, etc...). Tout comme inscrire une structure dans un fichier binaire.

    Puis si tu as une donnée de type référence mémoire dans la structure, il ne faut pas transmettre cette référence mémoire locale car elle ne sera pas significative sur la machine distante. D'où la nécessité de sérialiser ses données. Encore une fois faut-il le faire de façon portable.

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/03/2015, 09h24
  2. Envoi structure sur socket
    Par JokerAs dans le forum Réseau
    Réponses: 4
    Dernier message: 29/09/2014, 10h16
  3. Envoyer Objet / Structure par socket TCP
    Par crazy33 dans le forum C++
    Réponses: 5
    Dernier message: 21/11/2010, 20h49
  4. envoi fichiers sur socket
    Par hamidoo07 dans le forum Réseau
    Réponses: 3
    Dernier message: 03/06/2009, 20h24
  5. [sockets TCP] pb envoi de chaines, char :s
    Par sqwam71 dans le forum C
    Réponses: 9
    Dernier message: 14/01/2007, 00h10

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