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 :

Pb transfert structure par socket


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2003
    Messages : 51
    Points : 60
    Points
    60
    Par défaut Pb transfert structure par socket
    Bonjour à tous,

    Je dois transférer un fchier par socket d'un client vers un serveur.
    Pour ce faire, je souhaite en premier lieu, envoyer une structrue contenant la taille et le nom du fichier. Le rpoblème est que si je récupère bien la taille, je n'ai pas le nom du fichier

    Cette structure est déclarée dans mon client et dans mon serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct head  
    {
      int size;
      char *FichierTransfertSock;
    };
    Côté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct head entete;  
      // Envoi des références du fichier à* transférer
      entete.size=TailleFichier(FichierTransfert);
      entete.FichierTransfertSock = FichierTransfert;
      nbchar = send(sock, (char *)&entete, sizeof(struct head),0);
      if (nbchar != sizeof(entete))   
      {
        printf("erreur envoi structure head");
        close(sock);
        exit(2);        
      }
    J'ai fait de sprintf pour vérifier que les éléments de ma strcuture soit bien valorisé et c'est ok.

    Côté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      struct head entete; 
      nbchar = recv(sock_service,(char *)&entete,sizeof(struct head),0);  
      printf("fichier à créer : %s  Taille fichier : %d\n",entete.FichierTransfertSock,entete.size);
    Les printf me donnent le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fichier à créer :   Taille fichier : 256
    Forcément derrière cela me pose un problème puisque le client m'envoie des lignes que je dois stocker dans un fichier pour lequel je n'ai pas de nom......

    Pour plus d'infos, un zip de mes sources :
    Merci d'avance pour l'aide que vous pourrez m'apporter.
    Fichiers attachés Fichiers attachés

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Problème de copie de chaine de caractères.

    Pour faire un copie de chaine, on utilise str[n]cpy ou strdup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    entete.FichierTransfertSock = FichierTransfert;
    /*à remplacer par*/
    entete.FichierTransfertSock = strdup(FichierTransfert);
     
    if(NULL == entete.FichierTransfertSock){
       perror("strdup");
       exit(0);
    }
     
    /* envoi*/
    nbchar = send(sock, (char *)&entete, /*Attention à la taille envoyée*/,0);
     
     
    free(entete.FichierTransfertSock)
    Dernière modification par Invité(e) ; 12/06/2008 à 13h07. Motif: petit oubli

  3. #3
    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
    Ton problème provient du fait que tu transfère une structure contenant un pointeur. Le pointeur est bien transmis mais pas l'objet pointé.
    Pour résoudre ton problème, il faut que ta structure à transmettre soit un objet "plein" (tu as même de la chance que cela ne crashes pas du coté du serveur).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct head  
    {
      int size;
      char FichierTransfertSock[1024];
    };
    Cela va marcher mais le problème est que quelque soit la longueur du nom du fichier, tu vas transmettre tout de même 1024 octets.

    Une autre possibilité si tu veux optimiser un peu la taille de ce qui est envoyé est de ne pas envoyer ta structure mais plutôt les éléments de ta structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nbchar = send(sock, entete.size, sizeof(entete.size), 0);
    int len = strlen(head.FichierTransfertSock);
    nbchar = send(sock, len, sizeof(len), 0);
    nbchar = send(sock, head.FichierTransfertSock, len, 0);
    Bien sûr, il faut aussi modifier le code du côté serveur.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2003
    Messages : 51
    Points : 60
    Points
    60
    Par défaut
    MErci à toi, je viens d'essayer cela parfaitement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoyer Objet / Structure par socket TCP
    Par crazy33 dans le forum C++
    Réponses: 5
    Dernier message: 21/11/2010, 20h49
  2. Transfert fichier par socket
    Par allserv dans le forum Réseau
    Réponses: 1
    Dernier message: 21/10/2008, 16h30
  3. [C#] Envoi d'une structure par un(e) socket
    Par joprog dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/03/2007, 11h29
  4. Transfert d'une image par socket stream
    Par francky23012301 dans le forum Langage
    Réponses: 1
    Dernier message: 31/10/2005, 16h06
  5. Transfert de fichiers par sockets
    Par Kaori dans le forum C++
    Réponses: 19
    Dernier message: 26/01/2005, 13h58

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