TsgcQUICServer › Methoden › WriteStreamData

WriteStreamData Methode

Schreibt Anwendungsbytes in genau einen bestimmten QUIC-Stream.

Syntax

procedure WriteStreamData(const aStream: TsgcQUICServerStream; const aData: TBytes); virtual;

Parameter

NameTypBeschreibung
aStreamconst TsgcQUICServerStreamDer Ziel-Stream, entweder einer, der von OpenStream zurückgegeben wurde, oder einer, der mit aConnection.FindStreamById gefunden wurde. Der Aufruf bewirkt nichts, wenn er nil ist oder kein OpenSSL-Handle besitzt.
aDataconst TBytesDie zu sendenden Bytes. Ein leeres Array bewirkt nichts.

Hinweise

Sendet aData auf dem einzelnen Stream, der durch aStream identifiziert wird. Anders als WriteData, das immer den Standard-Datenstream der Verbindung anspricht, adressiert diese Methode einen bestimmten Stream, was Multi-Stream-Transporte wie WebTransport benötigen.

Der Schreibvorgang ist nicht-blockierend. Wenn der Stream die Bytes noch nicht annehmen kann, treibt der Server die QUIC-Ereignisschleife an und wiederholt den Versuch, bis zu 100 Versuche mit jeweils 1 ms Pause dazwischen, und schreibt dann die eingereihten Bytes auf das Netzwerk. Ist der Stream nach diesen Versuchen immer noch nicht beschreibbar, gibt die Methode stillschweigend auf, sodass die Daten nicht gesendet werden und keine Ausnahme ausgelöst wird. Diese Grenze existiert, damit ein blockierter Peer den Pump-Thread nicht dauerhaft aufhängen kann.

Das Schreiben in einen vom Peer geöffneten unidirektionalen Stream ist kein gültiges QUIC, der Peer besitzt die Schreibseite. Schreiben Sie nur in einen Stream, dessen Unidirectional den Wert False hat, oder in einen unidirektionalen Stream, den Sie mit OpenStream geöffnet haben.

Diese Methode ist derzeit nur in der Delphi/C++Builder-Implementierung verfügbar. Die .NET-Implementierung stellt kein WriteStreamData bereit.

Beispiel


// push on a server-opened one-way stream
oStream := oServer.OpenStream(aConnection, True);
if Assigned(oStream) then
  oServer.WriteStreamData(oStream, TEncoding.UTF8.GetBytes('event: ping'));

// or answer on the stream the peer used, from OnQUICStreamData
procedure TfrmServer.OnQUICStreamDataEvent(Sender: TObject;
  const aConnection: TsgcQUICServerConnection; aStreamId: Int64;
  aUnidirectional: Boolean; const aData: TBytes);
var
  oStream: TsgcQUICServerStream;
begin
  if aUnidirectional then
    Exit; // the peer owns the write side of its uni stream
  oStream := aConnection.FindStreamById(aStreamId);
  if Assigned(oStream) then
    oServer.WriteStreamData(oStream, aData);
end;

Zurück zu Methoden