TsgcWebTransportSession › Methoden › FindStreamById

FindStreamById Methode

Gibt den Stream zurück, der mit der angegebenen QUIC-Stream-ID registriert ist, oder nil, wenn diese Sitzung keinen solchen Stream hat.

Syntax

function FindStreamById(aStreamId: Int64): TsgcWebTransportStream;

Parameter

NameTypBeschreibung
aStreamIdInt64Die zu suchende Stream-ID, die mit dem StreamId jedes Streams verglichen wird. Ein negativer Wert gibt nil zurück, ohne zu suchen.

Rückgabewert

Der TsgcWebTransportStream, dessen StreamId gleich aStreamId ist, oder nil, wenn kein Stream in dieser Sitzung übereinstimmt. Der Stream bleibt im Besitz der Sitzung.

Hinweise

FindStreamById durchläuft die Stream-Liste der Sitzung und gibt die erste Übereinstimmung zurück. Die Liste ist durch eine kritische Sektion geschützt, daher ist der Aufruf threadsicher. Sie durchsucht lokal geöffnete Streams (aus OpenStream) und vom Peer geöffnete (aus AddIncomingStream) gleichermaßen.

Die Suche ist linear, sie kostet also O(n) in der Anzahl der Streams, die die Sitzung registriert hat. Da StreamCount im Normalbetrieb nie schrumpft, wird dies bei einer langlebigen Sitzung, die viele Streams öffnet, zunehmend langsamer. Wenn Sie einen Stream auf einem heißen Pfad benötigen, halten Sie eine eigene Referenz, anstatt ihn jedes Mal nachzuschlagen.

Sie benötigen dies selten. Der HTTP/3-Client und -Server verwenden es intern, um eingehende QUIC-Daten an den richtigen Stream weiterzuleiten. Im Anwendungscode haben Sie das Stream-Objekt normalerweise bereits: OpenStream hat es zurückgegeben, OnStream hat es übergeben, oder Sender in OnData ist es. Greifen Sie nur dann zu FindStreamById, wenn Sie eine ID aus einer anderen Quelle haben, etwa aus Ihrer eigenen Korrelationstabelle oder einer Log-Zeile.

Ein geschlossener Stream ist weiterhin auffindbar, da das Schließen ihn nicht aus der Sitzung entfernt. Auf einen zurückgegebenen Stream zu schreiben ist daher kein Beweis dafür, dass er noch verwendbar ist.

.NET-Unterschied. Die verwaltete Version ist ein Wörterbuch-Lookup statt einer linearen Suche und gibt null zurück, wenn es keine Übereinstimmung gibt. Beachten Sie außerdem, dass unter .NET die StreamId eines lokal geöffneten Streams ein synthetischer Zähler und nicht die echte QUIC-Stream-ID ist (siehe OpenStream), sodass IDs aus einer Paketaufzeichnung nur zu vom Peer geöffneten Streams passen.

Beispiel


var
  oStream: TsgcWebTransportStream;
begin
  // vStreamId came from our own correlation table, not from a live object
  oStream := oSession.FindStreamById(vStreamId);
  if Assigned(oStream) then
    oStream.WriteData('continuation data')
  else
    memoLog.Lines.Add('stream ' + IntToStr(vStreamId) + ' is not in this session');
end;

Zurück zu Methoden