Zitat von
Burki:
Muß dazu sagen, daß das DataAvailable öfters durchlaufen wird (warum auch immer, wahrscheinlich kleinere Datenpakete), deswegen kann ich nicht sagen, daß wenn das Event "DataAvailable" fertig ist, auch alle Daten bei mir angekommen sind.
Richtig, Datenpakete treffen einzeln ein und jedesmal wird das Event "DataAvailable" gefeuert.
Aber auch das Ende eines "logischen" Datenpakets wird im
Protokoll geregelt.
Wenn im Datenstrom ein CR LF eintrifft, dann sind die Daten vollständig und du kannst die zusammengesetzte Einzelpakete verarbeiten.
So ist das z.B. beim SMTP oder POP3 geregelt.
Bei binären Daten muss man vor den eigentlichen Nutzdaten die Länge der folgenden Daten mitteilen.
Delphi-Quellcode:
// Beispiel
var
receivedata : string;
procedure Txxxx.DataAvailable(...);
var
p : integer;
begin
// Daten anhängen
receivedata := receivedata + socket.ReadString();
// prüfen ob schon fertig
p := Pos(#13#10, receivedata);
if p > 0 then
begin
Verabeite(Copy(receivedata, 1, p-1));
// verarbeite Daten löschen, der Rest könnte schon der Anfang des nächsten Datenpakets sein
Delete(receivedata, 1, p+1); // ob hier jetzt +1 oder +2 stehen muss, bitte selber ausprobieren
end;
end;