Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Fehler bei FileStream über Sockets. (https://www.delphipraxis.net/38857-fehler-bei-filestream-ueber-sockets.html)

tr909 25. Jan 2005 10:09


Fehler bei FileStream über Sockets.
 
Moin.
Also ich versuche schon länger den Dateiversand über eine Socket-Verbindung zu realisieren. Habe auch schon viele Foren durforsten und teilweise auch was gefunden. Habe nun folgen Quellcode. Nur leider scheint das nur bei kleineren Dateien zu funktionieren. Bei größeren ist die empfangene Datei immer ein paar KB größer als das Orginal. Würde mich über das finden meines Fehlers freuen.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connected (Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocket1ClientConnected (Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1OnRead (Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect (Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
    FStream: TFileStream;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ClientSocket1: TClientSocket;
  ServerSocket1: TServerSocket;
  Dateiname : String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FStream := nil;
  RStream := nil;
  ServerSocket1 := TServerSocket.create (self);
  ClientSocket1 := TClientSocket.create (self);
  ServerSocket1.OnClientConnect := ServerSocket1ClientConnected;
  ServerSocket1.OnClientDisconnect := ServerSocket1ClientDisconnect;
  ClientSocket1.OnConnect      := ClientSocket1Connected;
  ClientSocket1.OnRead         := ClientSocket1OnRead;
  ClientSocket1.OnDisconnect   := ClientSocket1Disconnect;
  ServerSocket1.Port := 1080;
  ClientSocket1.Port := 1080;
  ClientSocket1.Host := '127.0.0.1';
end;

procedure TForm1.ServerSocket1ClientDisconnect (Sender: TObject; Socket: TCustomWinSocket);
begin
  if Assigned(FStream) then
  begin
    FStream.Free;
    FStream := nil;
  end;
end;


procedure TForm1.ClientSocket1OnRead (Sender: TObject; Socket: TCustomWinSocket);
var
  iLen: Integer;
  Bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  try
    Socket.ReceiveBuf(Bfr^, iLen);
    RStream.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr);
  end;
end;


procedure TForm1.ClientSocket1Connected (Sender: TObject; Socket: TCustomWinSocket);
begin
    RStream := TFileStream.Create(Dateiname+'_send', fmCreate or fmShareDenyWrite);
end;

procedure TForm1.ServerSocket1ClientConnected (Sender: TObject; Socket: TCustomWinSocket);
begin
  Socket.SendStream(TFileStream.Create(Dateiname, fmOpenRead or fmShareDenyWrite));
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  if Assigned(FStream) then
  begin
    FStream.Free;
    FStream := nil;
  end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.execute then
    begin
      Dateiname := OpenDIalog1.Filename;
      ServerSocket1.Active := True;
      ClientSocket1.Active := True;
    end;

end;

end.
P.S.: nein, ich möchte es nicht mit den INDY-Komps machen ;)

Gruß
tr909

Muetze1 25. Jan 2005 22:44

Re: Fehler bei FileStream über Sockets.
 
Moin!

1. globale Variablen - wie eckelhaft (Achtung! persönliche Meinung).
2. Warum wird FStream einmal erzeugt aber von beiden Sockets versucht freizugeben?
3. Woher kommt die RStream Variable?
4. RStream erzeugen und überall mit FStream arbeiten? Was denn nun?

MfG
Muetze1

tr909 31. Jan 2005 10:45

Re: Fehler bei FileStream über Sockets.
 
zu 1) hmm
zu 2) Das war nur ein Test meinerseits, weil ich dachte das könnte der Fehler sein
zu 3 und 4) Das Hast du recht. Das RStream sollte ein FStream sein.

Das Problem was ich nur habe ist, das die empfangene Datei halt größer ist als das Orginal.
Ich hatte auch schon eine Variante mit nem Buffer probiert, nur da bekomme ich, wenn die Datei größer als de Buffer die Fehlermeldung das die Datei nicht verwendet werden kann, weil sie schon benutzt wird.

mfg
tr909

Muetze1 31. Jan 2005 11:14

Re: Fehler bei FileStream über Sockets.
 
Moin!

Die ReceiveBuffer kann kleinere Werte zurückgeben vom empfangen als dein Buffer oder ReceiveLength gross ist.

Delphi-Quellcode:
Var
  iLen: Integer;
  Bfr: Pointer;
Begin
  GetMem(Bfr, Socket.ReceiveLength);
  try
    While ( Socket.ReceiveLength > 0 ) Do
    Begin
      iLen := Socket.ReceiveBuf(Bfr^, Socket.ReceiveLength);
      RStream.Write(Bfr^, iLen);
    End;
  finally
    FreeMem(Bfr);
  End;
End;
Klappt es so?

MfG
Muetze1

tr909 31. Jan 2005 11:26

Re: Fehler bei FileStream über Sockets.
 
Werde es nachher zu Hause mal ausprobieren. :D

*edit* Hat wunderbar funktioniert. Vielen Dank für die schnelle Hilfe

Gruß
tr909


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz