TsgcQUICServer › Methoden › WriteStreamData
Schreibt Anwendungsbytes in genau einen bestimmten QUIC-Stream.
procedure WriteStreamData(const aStream: TsgcQUICServerStream; const aData: TBytes); virtual;
| Name | Typ | Beschreibung |
|---|---|---|
aStream | const TsgcQUICServerStream | Der 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. |
aData | const TBytes | Die zu sendenden Bytes. Ein leeres Array bewirkt nichts. |
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.
// 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;