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 :

fichiers modifiés après passage par socket


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 51
    Points
    51
    Par défaut fichiers modifiés après passage par socket
    J'essais d'envoyer divers fichiers sur mon réseau grace aux sockets, les fichiers sont bien transférés mais ils sont modifiés.
    Exemple d'un screenshot après réception:





    voici le code qui envois l'image :
    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
    48
    49
    50
    51
    52
    53
    54
    55
     
    int raffraichissementEcran( SOCKET csock  )
     
    {
         FILE* fichier = NULL ; 
     
         int octelEnvoye = 0 , iVideChaine = 0 , i = 0 ;
         char carac = ' ' , tailleEnChar[30]="";
         char messageAEnvoyer[1024]="";
         long size;
     
    /******************************
    ici le code qui fait le screen et l'enregistre sous shot.bmp 
    ******************************/
     
         fichier = fopen ( "shot.bmp" , "rb" );                             
     
         if ( fichier != NULL ) 
         {     
               printf ( "\nEnvois fichier\n" ) ;
     
    //permet de connaitre la taille du fichier              
               fseek(fichier, 0, SEEK_END);       
               size = ftell(fichier);             
               fseek(fichier, 0, SEEK_SET );
     
    //transforme cette taille en char           
               sprintf(tailleEnChar, "%d", size);
     
    //envois la taille du fichier           
               iVideChaine = send(csock, tailleEnChar, sizeof(tailleEnChar), 0);
     
     
    //envois les donnée tant que la taille n'a pas été dépasser
               do
               {
     
                     fread(messageAEnvoyer, 1, 1024, fichier);
                     octelEnvoye = octelEnvoye + send(csock, messageAEnvoyer, 1024, 0);
     
                     printf ( "\n%d/%d " , octelEnvoye ,size ); 
     
               }while ( octelEnvoye < size ); 
     
    //fermeture du fichier
               fclose(fichier);
               printf ( "\n\nFin envois\n" ) ;                                   
         }
     
         else
         {
               printf ( "\nErreur ouverture fichier" ) ;
         }      
     
    }


    voici le code qui reçoit l'image :

    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
    void __fastcall TForm1::ButtonRaffraichissementImageClick(TObject *Sender)
    {
    	char ChaineRecus[1024] = "" ;
    	int testReussite , taille = 0, octelRecus = 0 ;
    	FILE *fichier = NULL ;
    	fichier = fopen("shoot.bmp","wb");
    	ListBoxDiaogue->Items->Add("           Demande de rafraichissement");
    	testReussite = send(sock, "dmdImg", 8, 0);
     
    	if (testReussite == -1)
    	{
    		   Application->MessageBox("Echec envoi message de raffraichissement","Erreur", MB_OK);
    		   ListBoxDiaogue->Items->Add("Erreur : demande raffraichissement non envoyée");
    	}
     
    	else
    	{
    		   ListBoxDiaogue->Items->Add("Demande raffraichissement envoyée");
     
    //reçoit la taille du fichier
    		   recv(sock, ChaineRecus, sizeof(ChaineRecus) , 0);
     
    //affiche puis transforme la taille en entier
    		   TexteOctelsARecevoir->Text = ChaineRecus ;
    		   taille =  TexteOctelsARecevoir->Text.ToInt() ;
     
    //reçoit les donnée tant que la taille n'a pas été dépasser
    		   do
    		   {
    				 octelRecus = octelRecus + recv(sock, ChaineRecus, sizeof(ChaineRecus) , 0);
    				 fwrite (ChaineRecus, 1, sizeof(ChaineRecus), fichier);
     
    		   }while (octelRecus < taille );
     
    	}
     
    //fermeture du fichier
    	fclose(fichier);
     
    //affichage de l'image
    	ImageScreemShot->Picture->LoadFromFile( "shoot.bmp" ) ;
     
    }
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 370
    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 370
    Points : 41 523
    Points
    41 523
    Par défaut
    1. Tu fais un envoi de 30 et une réception de 1024, j'ignore si ça passe bien ou non (il me semble que ça peut ne pas bien passer, selon le système)
    2. Tu ne fais pas gaffe au dernier envoi qui fait sûrement moins de 1024, mais je ne suis pas sûr que ce soit la source de l'erreur.
    3. Tu écris toujours 1024 dans le fichier, indépendamment de la taille effectivement reçue.
    4. Ça n'a sûrement pas une grande influence, mais utilise %ld pour ton sprintf().
    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
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 51
    Points
    51
    Par défaut
    Merci à toi Médinoc c'était surment à cause du dernier octel donc j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    do
               {
     
                     sizeLu = fread(messageAEnvoyer, 1, 1024, fichier);
                     octelEnvoye = octelEnvoye + send(csock, messageAEnvoyer, sizeLu, 0);
                     printf ( "\n%d/%d " , octelEnvoye ,size ); 
     
               }while ( octelEnvoye < size );
    avec le sizeLu le programme envois que le nécessaire et plus un multiple de 1024

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do
    		   {
                                     octelRecusAvant = octelRecus ;
    				 octelRecus = octelRecus + recv(sock, ChaineRecus, sizeof(ChaineRecus) , 0);
    				 fwrite (ChaineRecus, 1, (octelRecus - octelRecusAvant  ), fichier);
     
    		   }while (octelRecus < taille );
    avec octelRecus - octelRecus avant le programme écrit uniquement se qui lui a été envoyé

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/04/2014, 15h22
  2. [ClickOnce] Garder des fichiers modifiés après une update
    Par User.Anonymous dans le forum VB.NET
    Réponses: 1
    Dernier message: 04/06/2009, 16h48
  3. [batch]fichiers modifiés après une certaine date
    Par skalimer0 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/09/2008, 08h14
  4. Date après passage par macro
    Par lhoste dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/07/2008, 13h48
  5. fichier modifier apres instruction de lecture???
    Par cyberwaves dans le forum C++
    Réponses: 4
    Dernier message: 09/09/2004, 22h02

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