![]() |
Datentransfer-Problem mit TMemoryStream
Folgenden Code nutze ich zum versenden:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var maxUpl: Integer; begin maxUpl := ScrollBar1.Position * 1024; //Max Byte Anzahl die gesendet werden darf If maxUpl >= sM.Size - sM.Position then // Wenn mehr gesendet werden darf begin // als noch zu senden ist: ClientSocket1.Socket.SendBuf(Pointer(Int64(sM.Memory) + sM.Position)^, sM.Size - sM.Position); Timer1.Enabled := False; end else begin // Soviel Bytes senden wie in maxUpl steht ClientSocket1.Socket.SendBuf(Pointer(Int64(sM.Memory) + sM.Position)^, maxUpl); sM.Position := sM.Position + maxUpl; end; end; Und folgenden zum Empfangen von Dateien:
Delphi-Quellcode:
var
rL: Integer; begin rL := Socket.ReceiveLength; // rL die Größe der empfangen Daten zuweisen If rL = 0 then Exit; // Es kann sein das nix ankommt, das wäre schlecht ;) If Rec then begin // Wenn im Receive-Mode: Socket.ReceiveBuf(Pointer(Int64(rM.Memory) + rM.Position)^, rL); rM.Position := rM.Position + rL; // Position setzen If rM.Position = rSize then // Wenn Datei vollständig: begin rM.SaveToFile('C:\Receive.txt'); // Datei Speichern rM.Clear; // Stream leeren Label1.Caption := 'Übertragung fertig'; Rec := False; // aus den Receive-Mode gehen end; end else begin rSize := StrToInt(Socket.ReceiveText); // rSize die Größe der Datei zuweißen rM.SetSize(rSize); // Speicher reservieren rM.Position := 0; // Position auf Null setzen Rec := True; // Auf Receive-Mode stellen Socket.SendText('ok'); // Bestätigung senden end; end; Das Problem ist nun, wenn ich die maximale Uploadgeschwindigkeit zB auf 16 KB stell und eine 500 KB große Datei verschick dann ist kurz nach der Hälfte der Datei Schluss mit empfangen, gesendet wird alles, zumindest wird es so angezeigt. Nur empfangen wird nur ca. die Hälfte, dann is ende mit Datentransfer beim Empfänger. Ist die eingestellte Uploadgeschwindigkeit allerdings sehr hoch, dann tritt das Problem nicht auf. Das Problem tritt auch nur im Internet auf, wo die Upload-/Downloadrate entsprechend auch nich so hoch is, im Netzwerk wird alles problemlos verschickt. Allerdings habe ich keine ahnung, wieso das im Internet nicht geht. |
Re: Datentransfer-Problem mit TMemoryStream
das tcp/ip protokol hat doch eigentlich ne Fehlerkorektor oder nicht?? probiers mal mit TIdTCPServer und dem entsprechenden client dazu
|
Re: Datentransfer-Problem mit TMemoryStream
Ist es denn mit der Indy-Komponente möglich eine Art OnProgress zu haben, beim Senden, so wie Empfangen? Damit ich halt nen Statusbalken mit dem Fortschritt habe, denn sonst bringt es mir auch nichts. :(
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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