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

Delphi Discussion :

[D7][INDY9]Prob OpenWriteBuffer


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Par défaut [D7][INDY9]Prob OpenWriteBuffer
    Mon projet est de récuperer des screenshoots et des logs d'un serveur ou plusieurs serveurs.
    Etant debutant en Delphi surtout sur la partie reseau (composant Indy) je me suis inspiré d'un explemple (ScreenThief - stealing screen shots over the Network) disponible a l'adresse ci-dessous:
    http://delphi.about.com/od/internetintranet/l/aa012004a.htm

    J'y ai greffé une partie permettant de recuperer les fichiers logs (enfin un pour l'instant )

    Mon probleme se situe dans la partie cliente:
    Lors du 1er passage dans la condition "if sCommand = 'TakeLog' then"
    tout ce passe bien et le transfert du fichier ce fait correctement.
    Mais lors du deuxieme passage le programme "gele" est ne repond a plus aucune commande comme si le stream etait cassé.
    Le prog s'arrete a la ligne "TCPClient.OpenWriteBuffer;"
    Naturellement le transfert de screenshots ne fonctionnent plus apres le deuxieme appel

    Voici le code de la partie cliente:
    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
    56
    procedure TMainFormClient.TimerTimer(Sender: TObject);
    var
      FileStream : TFileStream;
      JpegStream : TMemoryStream;
      pic : TBitmap;
      sCommand : string;
    begin
      if not TCPClient.Connected then Exit;
     
      Timer.Enabled := False;
     
      TCPClient.WriteLn('CheckMe'); //command handler
      sCommand := TCPClient.ReadLn;
     
     
      begin
        IncomingMessages.Lines.Insert(0,'About to take a log: ' + DateTimeToStr(Now));
        //envoi le fichier de logs
     
        EnterCriticalSection(CritSect);
        //FileStream := TFileStream.Create('C:\LOG.TXT',fmopenwrite);
        FileStream := TFileStream.Create('C:\LOG.TXT',fmOpenRead,fmShareDenyWrite);
        LeaveCriticalSection(CritSect);
            TCPClient.WriteInteger(FileStream.Size);
            TCPClient.OpenWriteBuffer;
            TCPClient.WriteStream(FileStream);
            TCPClient.CloseWriteBuffer;
            FreeAndNil(FileStream);
     
     
        TCPClient.ReadLn;
      end;
     
      if sCommand = 'TakeShot' then
      begin
     
        pic := TBitmap.Create;
        JpegStream := TMemoryStream.Create;
        ScreenShot(0,0,Screen.Width,Screen.Height,pic);
        BMPtoJPGStream(pic, JpegStream);
        pic.FreeImage;
        FreeAndNil(pic);
     
        // copy file stream to write stream
        TCPClient.WriteInteger(JpegStream.Size);
        TCPClient.OpenWriteBuffer;
        TCPClient.WriteStream(JpegStream);
        TCPClient.CloseWriteBuffer;
        FreeAndNil(JpegStream);
     
        //making sure!
        TCPClient.ReadLn;
      end;
     
      Timer.Enabled := True;
    end;
    Le code de la partie 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
    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
    56
    57
    58
    59
    60
     
    procedure TMainFormServer.TCPServerExecute(AThread: TIdPeerThread);
    var
      Client : PClient;
      Command : string;
      Size : integer;
      PicturePathName : string;
      ftmpStream : TFileStream;
     
    begin
     
      if not AThread.Terminated and AThread.Connection.Connected then
      begin
        Client := PClient(AThread.Data);
        Client.LastAction := Now;
     
        Command := AThread.Connection.ReadLn;
        if Command = 'CheckMe' then
        begin
          if client.TakeLog = True then
          begin
             Client.TakeLog := False;
             AThread.Connection.WriteLn('TakeLog');
             PicturePathName := ExtractFileDir(ParamStr(0)) + '\' + Client.HostName + '_Log' + inttostr(i) + '.txt';
             i := i + 1;
            if FileExists (PicturePathName) then DeleteFile(PicturePathName);
            ftmpStream := TFileStream.Create(PicturePathName,fmCreate);
            Size := AThread.Connection.ReadInteger;
            AThread.Connection.ReadStream(fTmpStream,Size,False);
            FreeAndNil(fTmpStream);
     
            AThread.Connection.WriteLn('Take Log DONE');
     
            ClientsListBoxClick(nil);
     
          end;
          if Client.TakeShot = True then
          begin
            Client.TakeShot := False;
     
            AThread.Connection.WriteLn('TakeShot');
     
            PicturePathName := ExtractFileDir(ParamStr(0)) + '\' + Client.HostName + '_Screen.JPG';
     
            if FileExists (PicturePathName) then DeleteFile(PicturePathName);
            ftmpStream := TFileStream.Create(PicturePathName,fmCreate);
            Size := AThread.Connection.ReadInteger;
            AThread.Connection.ReadStream(fTmpStream,Size,False);
            FreeAndNil(fTmpStream);
     
            AThread.Connection.WriteLn('DONE');
     
            RefreshImage(Client.HostName, PicturePathName);
            ClientsListBoxClick(nil);
          end
          else
            AThread.Connection.WriteLn('DONE');
        end;
      end;
    end;
    Quelqu'un a-t-il une idée ou voit-il une erreur dans le code ?
    Merci d'avance

  2. #2
    Membre émérite
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Par défaut
    Apres un debuggage minutieux voila le schema de deroulement:

    1er passage dans la boucle du client:
    TCPClient.WriteInteger(FileStream.Size); //FileStream.size = 5 (Ko)
    TCPClient.OpenWriteBuffer;
    TCPClient.WriteStream(FileStream); //Handle=2615 (par exemple)
    TCPClient.CloseWriteBuffer;
    1er passage dans la boucle du serveur:
    tmpStream1 := TFileStream.Create(FilePathName,fmCreate);
    SizeFile := AThread.Connection.ReadInteger; // SizeFile = 5 (ko)
    AThread.Connection.ReadStream(fTmpStream1,SizeFile,False);
    FreeAndNil(fTmpStream1)
    Jusqu'ici tout va bien...le client étant l'emetteur de l'envoi le serveur receptionne bien un fichier de 5ko de taille.

    2eme passage dans la boucle du client:
    TCPClient.WriteInteger(FileStream.Size); //FileStream.size = 5 (Ko)
    TCPClient.OpenWriteBuffer;
    TCPClient.WriteStream(FileStream); //Handle=2615 (par exemple)
    TCPClient.CloseWriteBuffer;
    1er passage dans la boucle du serveur:
    tmpStream1 := TFileStream.Create(FilePathName,fmCreate);
    SizeFile := AThread.Connection.ReadInteger; // SizeFile = 1045623875 (ko)
    AThread.Connection.ReadStream(fTmpStream1,SizeFile,False);
    FreeAndNil(fTmpStream1)
    Voila ce qui ce passe au 2eme passage dans la partie serveur.
    SizeFile contient une valeur hallucinante !!!
    Puis le programme plante...normal me direz-vous
    Coté client j'envoi le meme fichier et coté serveur (a la reception) je créé un nouveau fichier a chaque réception.

    Je me demande si le probleme ne vient pas plutot des methodes de receptions
    (ReadInteger et ReadStream) ...mais ou est l'erreur ?? ca ...

    Quelqu'un a-t-il deja eu affaire a ce type de probleme ?
    Merci d'avance pour votre aide ...

  3. #3
    Membre émérite
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Par défaut
    Probleme résolu !!!! Ouf
    Un petit probleme de synchonisation dans le dialogue entre les sockets
    Un prob a la c... qui ma fait perdre quelques heures !!

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

Discussions similaires

  1. prob avec utilisation de package
    Par martijan dans le forum Modules
    Réponses: 13
    Dernier message: 11/07/2003, 09h37
  2. [Script]prob de clés étrangères
    Par Seb7 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 08/07/2003, 17h37
  3. Prob, images, Panels, et form.
    Par CaptainChoc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 10/05/2003, 10h08
  4. Thread probs avec WaitFor()
    Par pixelrock dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2002, 09h40
  5. [Kylix] prob listview
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 22/10/2002, 21h37

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