TsgcQUICServer › TsgcQUICServerStream

TsgcQUICServerStream Klasse

Kapselt einen zusätzlichen QUIC-Stream auf einer Verbindung, neben dem Standard-Datenstream.

Einführung

Eine QUIC-Verbindung multiplext viele unabhängige Streams. TsgcQUICServerConnection behält den ersten vom Peer geöffneten bidirektionalen Stream als einzigen Standard-Datenstream, in den WriteData schreibt. Jeder andere Stream der Verbindung, ob vom Peer oder vom Server geöffnet, wird als TsgcQUICServerStream in der Streams-Liste der Verbindung geführt.

Sie erhalten eine Instanz auf eine von zwei Arten:

1. Rufen Sie OpenStream auf, um einen servergestarteten Stream zu erstellen. Die Methode gibt den Wrapper zurück.

2. Rufen Sie aConnection.FindStreamById(aStreamId) mit der von OnQUICStreamData gemeldeten Stream-ID auf, um den Wrapper für einen vom Peer geöffneten Stream zu erhalten.

Übergeben Sie den Wrapper an WriteStreamData, um Bytes auf genau diesem Stream zu senden.

Lebensdauer. Der Wrapper gehört der Streams-Liste der Verbindung und gibt beim Zerstören sein OpenSSL-Stream-Handle frei. Geben Sie ihn niemals selbst frei. Der Transport entfernt und zerstört einen Stream, wenn der Peer ihn abschließt oder ein Fehler auftritt. Zwischenspeichern Sie die Referenz daher nicht über Ereignisse hinweg, sondern ermitteln Sie sie stattdessen per ID mit FindStreamById.

Zusätzliche Streams werden nur im Multi-Stream-Modus verfolgt. Ein einfacher QUIC-Server ignoriert zusätzliche Peer-Streams, sofern AlwaysMultiStream nicht True ist. TsgcHTTP3Server setzt es für Sie, da HTTP/3 die Control- und QPACK-Streams des Peers benötigt.

Deklaration

TsgcQUICServerStream = class
public
  property SSL: PSSL read FSSL write FSSL;
  property StreamId: Int64 read FStreamId write FStreamId;
  property Unidirectional: Boolean read FUnidirectional write FUnidirectional;
  property Incoming: Boolean read FIncoming write FIncoming;
end;

Properties

NameTypBeschreibung
StreamIdInt64Die vom Transport zugewiesene QUIC-Stream-ID, wie von OpenSSL gemeldet. -1, wenn die ID nicht gelesen werden konnte. Dies ist der Wert, den OnQUICStreamData meldet, und der Schlüssel, auf den FindStreamById abgleicht.
UnidirectionalBooleanTrue für einen Einweg-Stream, False für einen bidirektionalen. Bei akzeptierten Peer-Streams leitet der Transport dies aus Bit 0x02 der Stream-ID ab, das QUIC zur Kennzeichnung unidirektionaler Streams reserviert. Bei vom Server geöffneten Streams ist es das Argument aUnidirectional, das Sie an OpenStream übergeben haben.
IncomingBooleanTrue, wenn der Peer den Stream geöffnet hat, False, wenn der Server ihn über OpenStream geöffnet hat. Der Transport liest einen Stream nur, wenn er eingehend oder bidirektional ist, daher ist ein vom Server geöffneter unidirektionaler Stream ausschließlich zum Schreiben bestimmt und löst niemals OnQUICStreamData aus.
SSLPSSLDas rohe OpenSSL-Handle für diesen Stream. Für fortgeschrittene Interoperabilität offengelegt. Geben Sie es nicht frei, der Wrapper besitzt es und gibt es in seinem Destruktor frei.

Hinweise

Diese Klasse ist ein dünner Wrapper um einen OpenSSL-QUIC-Stream. Sie besitzt keine eigenen Methoden, das Schreiben erfolgt über WriteStreamData auf dem Server und das Lesen wird über OnQUICStreamData geliefert.

Diese Klasse ist derzeit nur in der Delphi/C++Builder-Implementierung verfügbar. Die .NET-Implementierung besitzt keine Multi-Stream-Serveroberfläche, daher gibt es dort kein TsgcQUICServerStream, kein OpenStream und kein WriteStreamData.

Beispiel


// open a server-initiated bidirectional stream and write to it
procedure TfrmServer.OnQUICConnectEvent(Sender: TObject; const aConnection: TsgcQUICServerConnection);
var
  oStream: TsgcQUICServerStream;
begin
  oStream := oServer.OpenStream(aConnection, False);
  if Assigned(oStream) then
  begin
    Log('opened stream id ' + IntToStr(oStream.StreamId));
    oServer.WriteStreamData(oStream, TEncoding.UTF8.GetBytes('hello on my own stream'));
  end;
end;

// answer on the same stream the peer used
procedure TfrmServer.OnQUICStreamDataEvent(Sender: TObject; const aConnection: TsgcQUICServerConnection;
  aStreamId: Int64; aUnidirectional: Boolean; const aData: TBytes);
var
  oStream: TsgcQUICServerStream;
begin
  if aUnidirectional then
    Exit; // cannot write back on a peer unidirectional stream
  oStream := aConnection.FindStreamById(aStreamId);
  if Assigned(oStream) then
    oServer.WriteStreamData(oStream, aData);
end;

Anforderungen

VoraussetzungDetail
EditionAll-Access-Edition.
Compiler-DefineQUIC wird deaktiviert ausgeliefert. Entfernen Sie die Auskommentierung von {$DEFINE SGC_PACK_HTTP3} im All-Access-Block von sgcVer.inc, ausgeliefert wird es als {.$DEFINE SGC_PACK_HTTP3}. Das definiert wiederum SGC_QUIC, aber nur, wenn SGC_INDY_LIB definiert ist.
UnitsgcQUIC_Server
OpenSSLOpenSSL 3.5 oder neuer, erforderlich.
VerfügbarkeitNur Delphi/C++Builder.

Zurück zu TsgcQUICServer