Wobei 3 Byte die Transportschicht doch etwas unterlasten.
Wenn der UDPCLIENT die Daten wirklich sofort versendet, wenn man sie an Send übergibt, dann vervielfacht der Overhead der Transportschichten die Daten doch um ein Vielfaches und das Übertragen dauert umso länger.
Ach ja, wenn die Daten unbedingt ankommen müssen, dann versende es besser via
TCP.
Bei UDP kann es doch vorkommen, daß die Daten nicht ankommen und spurlos verschwinden.
Gut, dafür soll ja UDP schneller sein, da es eben keine Empfangskontrolle/Rückmeldung gibt.
Delphi-Quellcode:
procedure DataAvailable(const Data: string);
var
i: Integer;
begin
Buffer := Buffer + Data;
i := (Length(Buffer) div 3) * 3;
if i > 0 do begin
UDPCLIENT.SEND(Copy(Buffer, 1, i));
Delete(Buffer, 1, i);
end;
end;
Da via UDP doch die Daten auch in anderen Reihenfolgen ankommen können, wenn überhaupt (wenn ich das richtig verstanden hab), dann kann man natürlich gern noch den Puffer aufteilen, so daß er maximal so groß ist, wie der kleineste Frame, in der Übertragung, so daß diese Bytes immer zusammen bleiben.
Delphi-Quellcode:
procedure DataAvailable(const Data: string);
var
i: Integer;
begin
Buffer := Buffer + Data;
while Length(Buffer) > 2 do begin
i := Min(Length(Buffer) div 3, 85) * 3; // maximal 85 Pakete zusammen ... k.A. welche Größe Ideal wäre
UDPCLIENT.SEND(Copy(Buffer, 1, i));
// gibt es sowas wie ein UDPCLIENT.FLUSH?
Delete(Buffer, 1, i);
end;
end;
Man könnte natürlich auch auf den "Buffer" verzichten und die Daten direkt ans
TCP weitergeben, ohne zusätzliches umkopieren und aufsplitten.