AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Tcp Ip bei übertragung fehlen bytes
Thema durchsuchen
Ansicht
Themen-Optionen

Tcp Ip bei übertragung fehlen bytes

Ein Thema von Marlon · begonnen am 16. Mär 2016 · letzter Beitrag vom 16. Mär 2016
Antwort Antwort
Marlon

Registriert seit: 16. Mär 2016
4 Beiträge
 
#1

Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 10:52
Hallo Leute,
nachdem ich mich gestern mühsam in das Protokoll eingearbeitet habe, weil fast alles was man zu Indy findet aus alten Versionen ist, dachte ich ich könnte damit abschließen .
mein Problem ist dass bei der Übertragung von Daten immer vier Bytes fehlen.
Woran könnte das liegen?

Client:

Delphi-Quellcode:
procedure TFileExchangeClientForm.SetClientState(aState : Boolean);
begin
  if (aState = True) then
     begin
     IdTCPClient1.Connect;
     end
     else
     begin
     IdTCPClient1.Disconnect;
     end;
end;

function ClientSendFile(AClient: TIdTCPClient; Filename: String): Boolean;
begin
  AClient.IOHandler.LargeStream := True;
  Result := True;
  try
    AClient.IOHandler.WriteFile(Filename);
  except
    Result := False;
  end;
end;

procedure TFileExchangeClientForm.Button_SendStreamClick(Sender: TObject);
var
  LSize: LongInt;
begin
  IdTCPClient1.Host := '127.0.0.1';
  IdTCPClient1.Port := 6000;
  IdTCPClient1.Connect;
  LSize := 0;
  Memo1.Lines.Add('Versuche Stream zu Server zu schicken');
  if (ClientSendFile(IdTCPClient1, FileNameEdit.Text) = False) then
  begin
    Memo1.Lines.Add('Buffer konnte nicht gesendet werden' +
       FileNameEdit.Text);
    Exit;
  end
  else
  begin
    Memo1.Lines.Add('Buffer wird gesendet an ' + FileNameEdit.Text);
  end;
  SetClientState(False);
end;
Server:

Delphi-Quellcode:

procedure TFileExchangeServerForm.IdTCPServer1Execute(AContext: TIdContext);
var
  LSize: LongInt;
  file1 : String;
begin
  AContext.Connection.IOHandler.ReadTimeout := 9000;
  file1:= SaveFileEdit.Text;
  if (ServerReceiveFile(AContext, file1) = False ) then
  begin
    TIdNotify.NotifyMethod(ShowCannotGetFileErrorMessage);
    Exit;
  end;
  TIdNotify.NotifyMethod(FileReceived);
end;

function ServerReceiveFile(AContext: TIdContext; ServerFilename: String): Boolean;
var
  AStream: TFileStream;
begin
  try
    Result := True;
    AStream := TFileStream.Create(ServerFilename, fmCreate + fmShareDenyNone);
    try
      AContext.Connection.IOHandler.ReadStream(AStream);
    finally
      FreeAndNil(AStream);
    end;
  except
    Result := False;
  end;
end;
mfg Marlon

Geändert von Marlon (16. Mär 2016 um 10:59 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 11:25
  AClient.IOHandler.LargeStream := True;
Diese Zeile auf dem Client ändert das Protokoll, sie und muss daher auch auf der Serverseite verwendet werden, damit das vom Client gesendete und das vom Server erwartete Format zusammenpassen.

Lösung (ungetestet): vorAContext.Connection.IOHandler.ReadStream(AStream); noch ein AContext.Connection.IOHandler.LargeStream := True; einfügen.

Oder (falls nur Dateien mit Länge unter zwei Gigabyte übertragen werden), einfach das LargeStream := True; im Client entfernen.
Michael Justin

Geändert von mjustin (16. Mär 2016 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Marlon

Registriert seit: 16. Mär 2016
4 Beiträge
 
#3

AW: Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 11:36
Als erstes ein Danke an mjustin
ist vollkommen logisch aber ändert leider nichts am Resultat.

Es fehlen immer noch Daten in der neuen Datei.

Habe dein Edit gerade gesehen. Könnte der Befehl "AContext.Connection.IOHandler.LargeStream := True;" den fehler verursachen, wenn man eigentlich nur kleine Daten versenden will (bzw versendet)?

Geändert von Marlon (16. Mär 2016 um 11:42 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 11:52
Als erstes ein Danke an mjustin
ist vollkommen logisch aber ändert leider nichts am Resultat.

Es fehlen immer noch Daten in der neuen Datei.

Habe dein Edit gerade gesehen. Könnte der Befehl "AContext.Connection.IOHandler.LargeStream := True;" den fehler verursachen, wenn man eigentlich nur kleine Daten versenden will (bzw versendet)?
Nein, bei LargeStream dürfen Dateien auch weniger als 2 GB lang sein. Entscheidend ist dass Client und Server die gleiche Einstellung verwenden, da entsprechend mehr oder weniger Längenbytes vor den Dateidaten gesendet werden.
Michael Justin
  Mit Zitat antworten Zitat
Marlon

Registriert seit: 16. Mär 2016
4 Beiträge
 
#5

AW: Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 11:54
Ich schau mir die Konfiguration etc. nochmal genau an und melde mich wieder, wenn ich keine Lösung finde aber bis dahin danke für die schnelle Hilfe
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#6

AW: Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 12:48
Welche vier Bytes fehlen denn? Die ersten/letzten, oder unzusammenhängend irgendwelche?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Marlon

Registriert seit: 16. Mär 2016
4 Beiträge
 
#7

AW: Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 13:16
Mir ist gerade aufgefallen dass es immer unterschiedlich viele bytes sind.
Der fehler entsteht dadurch ,dass der client keinen stream erstellt. Es gibt praktisch kein gegenstück von der Serverkomponentdie Datei so auszulesen wie sie auch reingeschrieben wurde.
dennoch danke für die Hilfe.
Wenn ich das Problem gelöst habe werde ich die Lösung hier posten.

mfg Marlon
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Tcp Ip bei übertragung fehlen bytes

  Alt 16. Mär 2016, 16:42
Es gibt praktisch kein gegenstück von der Serverkomponent die Datei so auszulesen wie sie auch reingeschrieben wurde.
Da muss ich widersprechen. ReadStream macht genau das.

Bei LargeStream := True sendet die Komponente mit WriteFile zuerst die Größe des zu sendenden Streams als Int64, also 8 Bytes.

Der Server liest bei LargeStream := False //default die Größe des zu empfangenden Streams als LongInt, also 4 Bytes.

Entweder die Größe stimmt zwar, aber der Stream hat anfangs einen 4 Bytes Offset und die resultierende Datei ist um 4 Bytes am Ende zu kurz oder die Größe stimmt von vornherein nicht.
Chris
  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 02:54 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