AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Fehler bei FileStream über Sockets.
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei FileStream über Sockets.

Ein Thema von tr909 · begonnen am 25. Jan 2005 · letzter Beitrag vom 31. Jan 2005
Antwort Antwort
tr909

Registriert seit: 5. Nov 2004
193 Beiträge
 
Turbo Delphi für Win32
 
#1

Fehler bei FileStream über Sockets.

  Alt 25. Jan 2005, 11:09
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Fehler bei FileStream über Sockets.

  Alt 25. Jan 2005, 23:44
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
  Mit Zitat antworten Zitat
tr909

Registriert seit: 5. Nov 2004
193 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Fehler bei FileStream über Sockets.

  Alt 31. Jan 2005, 11:45
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Fehler bei FileStream über Sockets.

  Alt 31. Jan 2005, 12:14
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
  Mit Zitat antworten Zitat
tr909

Registriert seit: 5. Nov 2004
193 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Fehler bei FileStream über Sockets.

  Alt 31. Jan 2005, 12:26
Werde es nachher zu Hause mal ausprobieren.

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

Gruß
tr909
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz