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 d'un fichier par socket


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut Envoi d'un fichier par socket
    Bonjour,
    Je voudrais envoyer un fichier par socket... mais je me demande comment faire... je me suis dis que lire un certain nombre d'octet (nombre a defenir) puis l envoyer serait une bonne methode. Mais je ne sai spas trop comment m y prendre.

    alors envoyer quelque chose par un socket, pas de probleme ca je sais faire.
    lire un certain nombre d'octet d'un fichier ca je n'ai pas encore reussi.. les seuls renseignement que j'ai trouve, c'est que je devais faire un memcpy des octet lu de mon fichier dans un char* pour pouvoir l'envoyer.

    alors ce que je vous demande, c'est de m'expliquer comment faire pour lire ce fichier. Et aussi, pourquoi pas si vous voyez de meilleur facon d'envoyer un fichier par socket...

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh... Là, je ne vois pas du tout à quoi servirait un memcpy()...

    Tu prends un buffer
    Tu ouvres ta connexion
    Tu ouvres ton fichier
    En boucle
    - Tu lis des données du fichier vers le buffer
    - Tu envoies les données lues (si ça ne remplit pas tout le buffer) sur le socket
    Tu fermes ton fichier et ta connexion.

    Bien sûr, l'algo ci-dessus envoie les données du fichier de manière brute. Tu peux avoir besoin d'un protocole avant pour préciser la taille et/ou le nom du fichier...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    je vois bien ton raissonement et il m'a l'air pas mal du tout pour le protocol j'ai deja ce qu'il faut, c'est predefini

    et je voulais te demander.. pour la lecture du fichier dans un buffer, comment faire ???

    merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    • ifstream, ios::binary, istream::read().
    • new char[].
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    tout grand merci Médinoc J'ai reussi
    Mais j'ai encore un petit soucis
    Lorsque je fais une lecture du fichier d'un cou dans un buffer puis je le reecris dans un autre fichier, tout ce passe bien. Mais mon but est d'envoyer mon fichier par packet ==> je test la copie packet par packet ( dans mon test j'ai pris des packet de 30 octetc). La, la copie se passe correctement, enfin elle a l'air de se passer correctement.. j'ai tester avec des fichier . exe, apres la copie il s'execute correctement mais apparement tout les octets du fichier source ne sont pas recopier...

    je te montre comment je procede:
    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
     
        ifstream fileSource("sol.exe",ios::binary);
        ofstream fileOut("uuuuu.exe",ios::binary);
        ifstream fileOutC("uuuuu.exe",ios::binary);    
     
        char * contenuFichier;
        int FileSourceSize = GetFileSize(fileSource);
        int FileOutSize;
     
        cout << "taille du fichier a copier : " << FileSourceSize <<  endl;
     
        contenuFichier = (char*)malloc(30 * sizeof(char));
     
        while (!fileSource.eof()){
            fileSource.read(contenuFichier, 30);
            fileOut.write (contenuFichier,30); 
        }
     
        FileOutSize = GetFileSize(fileOutC);
        cout << "taille de la copie: " << FileOutSize << endl;
     
        delete [] contenuFichier;
        fileSource.close();    
        fileOut.close();
    pour le calcule de la taille du fichier, j'ai juste repris la methode expliquer dans la faq( ici)

    alors pour resultat j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    taille du fichier copier : 57344
    taille de la copie: 57240
    j'ai lu sur la faq qu'il etait tout a fait normal que ca puisse arriver. mais bon je voudrais arriver a ce kil le fasse correctement afin d'obtenir les meme CRC pour les 2 fichiers.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh... On peut savoir ce que tu fabriques avec deux fichiers en sortie ?
    Surtout que tu en écris un et tu lis la taille de l'autre...


    PS: Trente octets, c'est un peu ridicule. Pour la version finale, prend plutôt des buffers au moins multiples de 1ko (1024 octets)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par Médinoc
    Euh... On peut savoir ce que tu fabriques avec deux fichiers en sortie ?
    Surtout que tu en écris un et tu lis la taille de l'autre...
    en fait la methode de calcule de la taille du fichier de la FAQ demande un std::ifstream & Fichier en entree ==> je reouvre le fichier que je vien de copier pour recalculer la table

    Citation Envoyé par Médinoc
    PS: Trente octets, c'est un peu ridicule. Pour la version finale, prend plutôt des buffers au moins multiples de 1ko (1024 octets)...
    ouep je sais c'est ridicule mais bon C le premier nombre qui m'est venu a l'esprit.. et comme tu le dis C pas encore la version finale

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    OK.
    Mon conseil : Ferme le fichier de sortie avant de le réouvrir en entrée : Les données ne sont pas toujours écrites immédiatement sur le disque.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    merci pour tes conseil j'ai trouver bon je ne suis pas sur que ce soit tres reglo comme methode.. mon code :
    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
    ifstream fileSource("sol.exe",ios::binary);
        ofstream fileOut("uuuuu.exe",ios::binary);
     
        char * contenuFichier;
        int FileSourceSize = GetFileSize(fileSource);
        int nbOctetsLu = 0;
     
        cout << "taille du fichier copier : " << FileSourceSize <<  endl;
     
        contenuFichier = (char*)malloc(1024 * sizeof(char));
     
        while (nbOctetsLu < FileSourceSize){
            if ( nbOctetsLu <= FileSourceSize-1024){ 
              fileSource.read(contenuFichier, 1024);
              fileOut.write (contenuFichier,1024); 
              nbOctetsLu += 1024;
            }else{
              fileSource.read(contenuFichier,FileSourceSize - nbOctetsLu );
              fileOut.write (contenuFichier,FileSourceSize - nbOctetsLu );              
              nbOctetsLu += FileSourceSize - nbOctetsLu ;              
            }
        }
     
        cout << "taille de la copie: " << nbOctetsLu << endl;
     
        delete [] contenuFichier;
        fileSource.close();    
        fileOut.close();
    peut etre qu'il est optimisable ??? enfin sinon apres la copie j'obtien le meme crc pour les 2 fichiers

    Encore merci pour tes conseils et recommandation

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Aleksis
    Bonjour,
    Je voudrais envoyer un fichier par socket... mais je me demande comment faire... je me suis dis que lire un certain nombre d'octet (nombre a defenir) puis l envoyer serait une bonne methode. Mais je ne sai spas trop comment m y prendre.
    C'est plus complexe que cela: il faut définir un protocole avec controles des erreurs , voir si coté client ou serveur tu reçois bien les paquets avec controle des CRC des paquets.
    C'est pour cela que tu as des erreurs.
    Quand tu envoies un paquet il faut créer un processsus qui ne sera détruit que si le destinataire a bien répondu ( paquets reçus ou erreur de connection de réception )
    Les sockets c'est bas-niveau , les protocoles c'est une couche au-dessus.
    Il faut que tu définisses ton propre ton protocole; tu peux t'inspirer de TCP-IP par exemple

    Citation Envoyé par Médinoc
    PS: Trente octets, c'est un peu ridicule. Pour la version finale, prend plutôt des buffers au moins multiples de 1ko (1024 octets)...
    Absolument ; il faut prendre des paquets multiples de 1024

    alors pour resultat j'obtiens:

    Code :
    taille du fichier copier : 57344
    taille de la copie: 57240
    j'ai lu sur la faq qu'il etait tout a fait normal que ca puisse arriver. mais bon je voudrais arriver a ce kil le fasse correctement afin d'obtenir les meme CRC pour les 2 fichiers.
    Problème de synchro client/serveur; il faut passer par une programmation multi-processus , sous Windows créer des threads

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Problème de synchro client/serveur; il faut passer par une programmation multi-processus , sous Windows créer des threads
    ??????

    Pour l'instant, il n'est même pas question de serveur multi-clients, et il n'a été dit nulle part que les sockets n'étaient pas bloquants...
    Et tant qu'ils resteront bloquants, il n'y aura pas de problème de ce genre.

    Edit: D'ailleurs pour l'instant il n'est même pas encore question de sockets, puisque c'est une copie locale qu'on tente, avant de passer à plus dur...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    contenuFichier = (char*)malloc(1024 * sizeof(char));
    Pourquoi tu alloues de la mémoire ? la pile est suffisante.

    Et si tu alloues avec malloc, il faut désallouer avec free.

    while (nbOctetsLu < FileSourceSize){
    if ( nbOctetsLu <= FileSourceSize-1024){
    fileSource.read(contenuFichier, 1024);
    fileOut.write (contenuFichier,1024);
    nbOctetsLu += 1024;
    }else{
    fileSource.read(contenuFichier,FileSourceSize - nbOctetsLu );
    fileOut.write (contenuFichier,FileSourceSize - nbOctetsLu );
    nbOctetsLu += FileSourceSize - nbOctetsLu ;
    }
    }
    istream::gcount retourne le nombre d'octets lus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int read;
     
    while( nbOctetsLu < FileSourceSize )
    {
        fileSource.read(contenuFichier, 1024);  
     
        read = fileSource.gcount();    
     
        fileOut.write (contenuFichier, read);  
     
        nbOctetsLu += read;
    }
    L'itération est humaine; la récursion, divine.

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Médinoc
    ??????

    Pour l'instant, il n'est même pas question de serveur multi-clients, et il n'a été dit nulle part que les sockets n'étaient pas bloquants...
    Et tant qu'ils resteront bloquants, il n'y aura pas de problème de ce genre.

    Edit: D'ailleurs pour l'instant il n'est même pas encore question de sockets, puisque c'est une copie locale qu'on tente, avant de passer à plus dur...

    ???? (Dialogue de sourd) : quel est l'intérêt d'utiliser des sockets ?
    Les sockets c'est pour envoyer des données d'un poste à un autre ;
    oui je me suis mal exprimé le destinataire n'est pas forcément un serveur ( d'ailleurs je n'ai quasiment pas parlé de serveur )

Discussions similaires

  1. Envoie de fichier par socket
    Par eracius dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 05/10/2007, 11h21
  2. Envoi de fichier par socket
    Par thebloodyman dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/08/2007, 17h07
  3. Envoi de fichier par socket
    Par dr_octopus74 dans le forum Réseau
    Réponses: 42
    Dernier message: 19/01/2007, 17h59
  4. Réponses: 3
    Dernier message: 06/03/2006, 10h36
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

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