![]() |
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:
P.S.: nein, ich möchte es nicht mit den INDY-Komps machen ;)
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. Gruß tr909 |
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 |
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 |
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:
Klappt es so?
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; MfG Muetze1 |
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