TsgcQUICServer › TsgcQUICServerStream
Kapselt einen zusätzlichen QUIC-Stream auf einer Verbindung, neben dem Standard-Datenstream.
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.
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;
| Name | Typ | Beschreibung |
|---|---|---|
StreamId | Int64 | Die 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. |
Unidirectional | Boolean | True 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. |
Incoming | Boolean | True, 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. |
SSL | PSSL | Das 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. |
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.
// 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;
| Voraussetzung | Detail |
|---|---|
| Edition | All-Access-Edition. |
| Compiler-Define | QUIC 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. |
| Unit | sgcQUIC_Server |
| OpenSSL | OpenSSL 3.5 oder neuer, erforderlich. |
| Verfügbarkeit | Nur Delphi/C++Builder. |