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 :

Envoi/Reception de structure


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Par défaut Envoi/Reception de structure
    Bonjour,
    Je dois realiser un client/serveur en C sous unix en utilisant des sockets.
    J'usqu'ici pas de soucis.
    Mais quand j'essais d'envoyer un structure particuliere, je n'arrive pas a recuperer mes donnees, l'exemple suivant sera plus explicite je pense.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include "stdafx.h"
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    struct MY_STRUCT {
      int int1;
      int int2;
      char* buffer;
    };
     
    MY_STRUCT getStruct()
    {
      MY_STRUCT myStruc;
      myStruc.int2 = 1;
     
      myStruc.buffer = (char*) malloc(10*sizeof(char));
      fgets(myStruc.buffer, 10, stdin);
      myStruc.int1 = strlen(myStruc.buffer);
     
      return myStruc;
    }
     
    void SendData(char * data)
    {
      // envois des data via ma socket
    }
     
    void ReceiveData(char* data)
    {
      // retrouver la taille du buffer
      // reallouer data avec la bonne taille
      // retrouver le buffer
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
      MY_STRUCT myStruc = getStruct();
      // envoi des donnees via ma socket
      SendData((char*)&myStruc);
     
      // initialisation par defaut
      char* data = malloc(1024);
      ReceiveData(data);
     
      return 0;
    }
    Est ce que quelqu'un aurait une idee?
    Merci d'avance

    Edit : petite precision, si mon buffer a une taille definie je n'ai pas de soucis. Mais le but est d'avoir une taille indefinie...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct MY_STRUCT {
      int int1;
      int int2;
      char buffer[100];
    };

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Dans getStruct(), tu lis les données sur stdin, il n'a pas un problème là? Par ailleurs, tu passes l'adresse de ta structure à sendStruct() en castant cette valeur en en pointeur sur char. Peut-on voir le code de sendStruct()? Il me semble que ta manière de sérialiser ta structure est étrange...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Par défaut
    Je crois en effet que le probleme vient de la serialization.
    Comment caster ma structure en char*??

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Tof_06 Voir le message
    Je crois en effet que le probleme vient de la serialization.
    Comment caster ma structure en char*??
    Pourquoi caster l'adresse de ta structure en char *? Pourquoi ne pas écrire la valeur de chaque champ de ta structure sous forme d'une chaîne de caractère (à l'aide de sprintf ou de snprintf) dans un tampon. Il te suffit ensuite d'envoyer ce tampon.

    A la réception, tu lis les caractères reçus à l'aide de fgets() et tu convertis chaque valeur avec la fonction qui va bien.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Par défaut
    Je caste en char* parce que la methode send de socket prend un char* en entree.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    J'étais en train d'éditer ma réponse ci-dessus lorsque tu as écris ton dernier post.

    Citation Envoyé par Thierry Chappuis
    Pourquoi ne pas écrire la valeur de chaque champ de ta structure sous forme d'une chaîne de caractère (à l'aide de sprintf ou de snprintf) dans un tampon. Il te suffit ensuite d'envoyer ce tampon.

    A la réception, tu lis les caractères reçus à l'aide de fgets() et tu convertis chaque valeur avec la fonction qui va bien.
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Citation Envoyé par Tof_06 Voir le message
    Je dois réaliser un client/serveur en C sous unix en utilisant des sockets.
    Aucun rapport avec ta question mais on ne sait jamais pour la suite.
    stdafx.h => Visual C++ => Windows
    Jamais entendu parler sous Unix.

    Attention, il y a quelques différences dans la programmation socket entre Unix et Windows.

Discussions similaires

  1. Envoi/Reception d'une structure en UDP
    Par f-k-z dans le forum C++
    Réponses: 3
    Dernier message: 07/06/2009, 20h36
  2. envoi / reception de messages
    Par Snowflake dans le forum C
    Réponses: 4
    Dernier message: 05/01/2006, 14h13
  3. Envoi/Reception de fichier sur un reseau
    Par Janitrix dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 19/12/2005, 14h10
  4. Envoi/Reception vers/depuis une base SQL
    Par TocTocKiéLà? dans le forum MFC
    Réponses: 2
    Dernier message: 31/10/2005, 19h14
  5. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47

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