Um über TCP/IP zu kommunizieren habe ich bisher erst die aktuelle Nachricht (z.B. 1 kb) in einen String gespeichert und dann an die gesammtnachricht (z.B. 200 MB angehängt.) da die kommunikation ja immer in kleinen Packeten geschieht.
Da gibt es natürlich Verbesserungspotential, da wenn man mal 200 MB an Daten verschickt viel im Speicher rumgeworfen wird.
Da die Funktion aSocket.GetMessage(out astring:string) aber nur aus 4 Zeilen besteht , wolte ich eine Eigene Funktion erstellen die die Nachricht direkt zum String anhängt:
Code: Alles auswählen
// ORIGINAL
function TLSocket.GetMessage(out msg: string): Integer;
begin
Result := 0;
SetLength(msg, BUFFER_SIZE); // Buffersize ist eine Constante = 262144
SetLength(msg, Get(PChar(msg)^, Length(msg)));
Result := Length(msg);
end;
// Meine Version:
procedure DownloadMsg(aSocket: TLSocket);
var
a:integer;
begin
a := length(buffer); // buffer ist hier der string in dem gespeichert wird.
SetLength(buffer, a+1+lCommon.BUFFER_SIZE); // das gleiche Buffersize wie oben ...
SetLength(buffer,a+aSocket.Get(PCHAR(@buffer[a+1])^, lCommon.BUFFER_SIZE));
end;
Ruf ich die Original Funktion auf so funktioniert alles einwandfrei.
Bei der Bearbeiteten Version steht beim Server , welche die Vielen Daten Sendet , nach einiger zeit der Buffer ist voll. Daraus schließe ich das ich hier etwas falsch angegeben habe.
die Get Funktion ist public und so definiert:
Code: Alles auswählen
Get(out aData; const aSize: Integer): Integer; virtual;