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 :

[c]socket : transfert fichier


Sujet :

Réseau C

  1. #1
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Points : 63
    Points
    63
    Par défaut [c]socket : transfert fichier
    salut a tous !

    voila, j'ai un soucis en c :
    je souhaite transmettre des fichier via socket pour un p2p. le probleme est que le transfert se passe mal sans que je comprenne ... voila mon code :

    STRUCTURE COMMUNE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
        char Buffer[500];
        int finFich;
    }sFich;
    COTE SERVEUR
    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
     
    void RecevoirFich(SOCKET sock , char * Trame)
    {
        char tmpNom[499];
        char tst;
        int sortie = 0;
        int lngRcv;
        int i = 0 , j = 1;
        for(i,j; Trame[j] != '\0';i++,j++)
            tmpNom[i] = Trame[j];
        tmpNom[i] = '\0';
        printf("3 - reception fichier : %s\n",tmpNom);
        FILE * Fich = fopen(tmpNom,"wb");
     
        sFich buff;
        buff.finFich = 0;
     
        if(Fich != NULL )
        {
            while( buff.finFich == 0)
            {
                recv(sock, &buff, sizeof( buff ) , 0);
                fwrite(buff.Buffer , 1 , strlen(buff.Buffer)*sizeof(char) , Fich);
            }
            fclose(Fich);
        }
    }
    COTE CLIENT :
    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
     
    void envoyerFichier(SOCKET sock,char * Buff)
    {
        char NomFichier[499];
        char buff[500] ;
        sFich buffer;
        buffer.finFich = 0;
        int i = 0 , j = 1;
        for(i,j; Buff[j] != '\0';i++,j++)
            NomFichier[i] = Buff[j];
        sendBuff(sock , Buff);
        FILE* fichier =fopen(NomFichier , "rb");
     
        if ( fichier != NULL) // ce test échoue si le fichier n'est pas ouvert
        {
            while (buffer.finFich == 0)
            {
                if( fread( buffer.Buffer , sizeof(char) , 500 , fichier ) <= 0)
                    buffer.finFich = 1;
                send(sock, &buffer, sizeof(buffer), 0);
                printf("%s\n" , buffer.Buffer);
                memset(buffer.Buffer,'\0',(500-1));
            }
     
            printf("envoi %s fini \n", NomFichier);
            fclose(fichier);
        }
        else
            printf("erreur ouverture fichier\n");
    }

    je signale juste que le transfert de fichier txt marche trés bien ...

    merci d'avance !

  2. #2
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Points : 63
    Points
    63
    Par défaut
    ah, eet voici les problèmes que j'ai :


    -le fichier ne se refait pas (en géneral : ~250ko sur le tout)
    -le client plante après envoi ...

    merci beaucoup pour l'aide !


    PS : petit abus de langage, c'est un client serveur, pas un p2p ^^

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par nagadscar Voir le message
    je signale juste que le transfert de fichier txt marche très bien ...
    Citation Envoyé par nagadscar Voir le message
    -le fichier ne se refait pas (en général : ~250ko sur le tout)
    -le client plante après envoi ...
    Les problèmes n'arrivent que sur les fichiers binaires ?

    Dans le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n" , buffer.Buffer);
    Cette ligne peut faire n'importe quoi si buffer.Buffer est de type buffer.

    Dans le serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(buff.Buffer , 1 , strlen(buff.Buffer)*sizeof(char) , Fich);
    strlen ne doit être utilisé que sur des données textes.

    Solution : ajouter un champ dans la structure sFich qui donne la taille utile de la trame. (sera toujours à 500 sauf pour le dernier envoi).
    Du coup, il faut supprimer printf(...) dans le client et remplacer strlen(buffer.Buffer) par la taille utile de la trame.

  4. #4
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Points : 63
    Points
    63
    Par défaut
    ok je vais tenter ca.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Points : 63
    Points
    63
    Par défaut
    merci trop fort \o/

    en fait je fais toujours écrire 500 car , et comme j'ai un memset, ca passe niquel

    enfin j'ai juste testé pour un .jpg

    le .exe ne passe pas et je testerai pour un .avi ce soir.

    merci !

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par nagadscar Voir le message
    en fait je fais toujours écrire 500 car , et comme j'ai un memset, ca passe niquel

    enfin j'ai juste testé pour un .jpg

    le .exe ne passe pas et je testerai pour un .avi ce soir.
    Je ne suis pas sur qu'ajouter aléatoirement des octets au bout d'un fichier soit particulièrement conseillé.

    Si le dit fichier contient un checksum, c'est normal de ne pas pouvoir l'utiliser.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Points : 63
    Points
    63
    Par défaut
    salut !

    Pour info :

    le checksum se trouve sur presque tout donc il faut ajouter caractère par caractère, c'est mieux et y a moins de soucis.

    cdlt,
    naga

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    si ce bout de code peut t'aider :
    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
     
     
    recv (g, buffer, BUFFLEN, 0);
     
     
       //Recherche du fichier
       FILE* fLire ;
       fLire = fopen(buffer, "rb");
       int n = -1;
       if(fLire == NULL) //envoi de l'erreur : ficher inexistant
       {
    	   send(g, (char*)&n, 4, 0);
    	   exit(1);
       }
       else //fichier existant 
       {
     
    	   //envoi de la taille du fichier
    	   char tab[4];
    	   fseek(fLire, 0, SEEK_END);//placement en fin de fichier
    	   long taille = ftell(fLire);
    	   tab[3] = taille & 255; //utiliser plustot htonl()
    	   tab[2] = (taille >> 8) & 255;
    	   tab[1] = (taille >> 16) & 255;
    	   tab[0] = (taille >> 24) & 255;
    	   send(g, tab, 4,0);
     
     
    	   rewind(fLire);//retour au debut du fichier
     
     
    	   //envoi du contenu du fichier
    	   char buffer_fichier[BUFFLEN];
     
     
    	    int taille_cumule = 0;
    		int n2;
    		while (taille_cumule <taille)
    		{
    			n2 = fread(buffer_fichier, sizeof(char), BUFFLEN, fLire);
    			send(g, buffer_fichier, n2, 0);
    			taille_cumule = n2 + taille_cumule;
    		}
     
     
     
       }

  9. #9
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 105
    Points : 63
    Points
    63
    Par défaut
    salut !

    Merci de ton aide, mais en fait j'ai envoyé le contenu de mon fichier caractère par caractère et ca fonctionne.

    bonne journée !
    naga

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

Discussions similaires

  1. Socket: transfert de fichiers
    Par timtima dans le forum Réseau
    Réponses: 5
    Dernier message: 28/11/2007, 12h54
  2. transfert fichier via socket
    Par ac/dc dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/11/2006, 21h21
  3. [Sockets] transfert de fichier client/serveur
    Par alex6891 dans le forum Développement
    Réponses: 6
    Dernier message: 20/03/2006, 16h14
  4. [Socket]Transfert données + fichier
    Par willowII dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 17/08/2005, 23h08
  5. [Socket]Transfert de fichier
    Par Aminos dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 19/04/2003, 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