TsgcQUICClient

TsgcQUICClient は、RFC 9000 に準拠したローレベルの QUIC クライアントです。サーバーへの QUIC 接続を開き、QUIC ストリームを介してデータを交換します。

はじめに

TsgcQUICClient は RFC 9000 で定義されたトランスポートを実装する低レベル QUIC クライアントです。サーバーへの QUIC 接続を開き、QUIC ストリーム上でデータを交換します。OpenSSL 3.5 以降が提供する QUIC 実装上に構築されています。このコンポーネントを設定するには、以下の手順に従ってください。

QUIC は 2 つのエンジンのいずれかで動作し、使用されるエンジンは SSLQUICOptions.IOHandler に従います。既定の iohOpenSSL では、読み込まれた OpenSSL が OSSL_QUIC_client_method をエクスポートしていれば組み込みエンジン(qmBuiltin)が使用され、OpenSSL 3.5 の QUIC TLS API(SSL_set_quic_tls_cbs)のみをエクスポートしている場合は sgc エンジン(qmCustom)がフォールバックとして使用されます。iohNativeTLS では常に sgc エンジンが使用され、TLS 1.3 ハンドシェイクはネイティブ TLS エンジン上で実行され、セッションチケット、再開、0-RTT に対応します。パケット保護もネイティブであるため、OpenSSL は一切読み込まれません。詳しくはQUICのエンジン比較を参照してください。

1. TsgcQUICClient コンポーネントの新しいインスタンスを作成し、QUIC サーバーの Host と Port を設定します。

2. OnQUICConnect イベントを処理し、Active を True に設定して接続を開き、WriteData でデータを送信します。使用例:


    oClient := TsgcQUICClient.Create(nil);
    oClient.Host := 'www.example.com';
    oClient.Port := 443;
    oClient.SSLQUIC := True;
    oClient.OnQUICConnect := OnQUICConnectEvent;
    oClient.Active := True;

    oClient.WriteData('Hello QUIC');

    procedure OnQUICConnectEvent(Sender: TObject; const
        Connection: TsgcQUICConnectionClient);
    begin
      ShowMessage('Connected to QUIC server');
    end;

リファレンス

主なプロパティ

名前説明
Activeリモートサーバーへの QUIC 接続を開いたり閉じたりします。
Hostクライアントが接続する QUIC サーバーの IP アドレスまたは DNS 名。
PortQUIC サーバーへの接続に使用する UDP ポート。
SSLQUICQUIC が必要とする TLS 1.3 セキュアレイヤーを有効にします(デフォルトで有効)。
QUICOptionsQUIC トランスポートのクライアント側チューニングオプション。

主なメソッド

名前説明
Connectサーバーへの QUIC 接続を開き、接続が確立されるかタイムアウトが切れるまで待機します。
Disconnectサーバーへの QUIC 接続を閉じます。
WriteDataデフォルト QUIC ストリームを介してサーバーにデータを送信します。
OpenStream新しい QUIC ストリームを開き、データを送信できるように返します。

主なイベント

名前説明
OnQUICConnectクライアントが QUIC サーバーへの接続に成功した直後に発生します。
OnQUICDisconnectQUIC 接続が閉じられたときに発生します。
OnQUICExceptionQUIC 接続で例外が発生したときに発生します。

完全な使用例


oClient := TsgcQUICClient.Create(nil);
oClient.Host := 'www.example.com';
oClient.Port := 443;
oClient.SSLQUIC := True;
oClient.OnQUICConnect := OnQUICConnectEvent;
oClient.OnQUICDisconnect := OnQUICDisconnectEvent;
oClient.OnQUICException := OnQUICExceptionEvent;

if oClient.Connect then
begin
  oClient.WriteData('Hello QUIC');
  oClient.Disconnect;
end;

procedure OnQUICConnectEvent(Sender: TObject; const Connection: TsgcQUICConnectionClient);
begin
  Log('connected');
end;

procedure OnQUICDisconnectEvent(Sender: TObject; const Connection: TsgcQUICConnectionClient; const Code: Integer);
begin
  Log('disconnected, code ' + IntToStr(Code));
end;

procedure OnQUICExceptionEvent(Sender: TObject; E: Exception);
begin
  Log('error: ' + E.Message);
end;

要件