Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy 10 TCP/IP Server-Client Filestream > 2 GB (https://www.delphipraxis.net/146889-indy-10-tcp-ip-server-client-filestream-2-gb.html)

Computerbabalulu 28. Jan 2010 21:16


Indy 10 TCP/IP Server-Client Filestream > 2 GB
 
Hallo ihr lieben.

Ich habe ein Problem mirt der Datenübertragung eines Filestreams.

Wenn ich vom client Daten an den Server sende die bis 2 GB groß sind, ist alles OK.
Ab 2GB großen Dateinen gibts nen Socket error (10054).

Hier mal etwas code:

Client

Delphi-Quellcode:
var
  AStream: TFileStream;
begin
  if OpenDialog1.Execute then
  begin
    AStream := TFileStream.Create(OpenDialog1.Filename,
      fmOpenRead + fmShareDenyNone);
    try
      IdTCPClient1.IOHandler.LargeStream := True;
      IdTCPClient1.IOHandler.SendBufferSize := 32768;
      IdTCPClient1.IOHandler.WriteLn('FILE'); // send command "FILE"
      IdTCPClient1.IOHandler.WriteLn(ExtractFilename(OpenDialog1.Filename)); // send file name
       IdTCPClient1.IOHandler.WriteLn(IntToStr(AStream.Size)); // send file size
      mClientLog.Lines.Add('Sending file "' + ExtractFilename
          (OpenDialog1.Filename) + '"');
           IdTCPClient1.IOHandler.Write(AStream);
      mClientLog.Lines.Add('Sent file "' + ExtractFilename
          (OpenDialog1.Filename) + '"');
    finally
      FreeAndNil(AStream);
    end;
  end;
end;

Server

Delphi-Quellcode:
var
  s: string;
  AStream: TFileStream;
  Filename: string;
  FileSize: Int64;
begin
  while AContext.Connection.Connected do
  begin
    s := AContext.Connection.IOHandler.ReadLn;
    if s = 'FILE' then
    begin
      Filename := AContext.Connection.IOHandler.ReadLn; // get filename
      FileSize := StrToInt(AContext.Connection.IOHandler.ReadLn);
      // get filesize
      ForceDirectories(ExtractFilePath(Paramstr(0)) + 'In');
      AStream := TFileStream.Create(ExtractFilePath(Paramstr(0))
          + 'In\' + Filename, fmCreate);
      try
        mServerLog.Lines.Add(AContext.Connection.Socket.Binding.PeerIP +
            ':Receiving file "' + Filename + '" ' + IntToStr(FileSize)
            + ' bytes');
        AContext.Connection.IOHandler.RecvBufferSize:= 32768;
        AContext.Connection.IOHandler.ReadStream(AStream, FileSize, False);
        mServerLog.Lines.Add(AContext.Connection.Socket.Binding.PeerIP +
            ':Received file "' + Filename + '"');
      finally
        FreeAndNil(AStream);
      end;
    end
    else if s = 'QUIT' then
    begin
      mServerLog.Lines.Add(AContext.Connection.Socket.Binding.PeerIP + ':QUIT');
      AContext.Connection.Disconnect;
    end
    else
    begin
      mServerLog.Lines.Add(AContext.Connection.Socket.Binding.PeerIP +
          ':UNKNOWN COMMAND: ' + s);
      AContext.Connection.Disconnect;
    end;
  end;
end;

Gibt es da eine grenze bei Indy und Dateigröße oder bin ich einfach nur zu blöd :gruebel:


Gruß

Luckie 28. Jan 2010 21:25

Re: Indy 10 TCP/IP Server-Client Filestream > 2 GB
 
Welche Delphi Version? Früher war TStream.Size in Integer bei neueren Delphi Versionen ist es ein Int64.

Computerbabalulu 28. Jan 2010 21:35

Re: Indy 10 TCP/IP Server-Client Filestream > 2 GB
 
Hallo Michael

Es ist Delphi 2010, und sollte somit int64 sein.

Gruß

Computerbabalulu 28. Jan 2010 23:04

Re: Indy 10 TCP/IP Server-Client Filestream > 2 GB
 
Moin

Hab den Fehler gefunden. War eine kleine unachtsamkeit.
Falls es einem interessiert weil er auch mal das selbe Problem hat ...

Der Fehler ist im Server:

Delphi-Quellcode:
....
var
FileSize : Int64

..........

FileSize := StrToInt(AContext.Connection.IOHandler.ReadLn);
StrToInt funktioniert hier bei zu großen Dateien nicht, es muss FileSize := StrToInt64(AContext.Connection.IOHandler.ReadLn);
sein.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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