Delphi TURN クライアント

Delphi / C++Builder から TURN サーバーと通信します。リレーされたトランスポートアドレスを割り当て、権限とチャネルを管理し、シンメトリック NAT 配下のピアとデータをやり取りできます。RFC 8656 に準拠しています。

TsgcTURNClient

TURN クライアント — Allocate、CreatePermission、ChannelBind、Send / Indication / Data、Refresh のすべてを RFC 8656 に基づく長期認証情報で署名します。

コンポーネントクラス

TsgcTURNClient

プロトコル

TURN (RFC 8656)

プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Enterprise

Allocate、Permission、Send

TURN サーバーを設定し、認証情報を TURNOptions.Authentication に指定して Allocate を呼び出した後、ピアごとに CreatePermission を実行し、SendIndication でデータをリレーします。

uses
  sgcP2P, sgcP2P_STUN_Classes, sgcP2P_STUN_Types, sgcP2P_TURN_Classes,
  sgcSocket_Classes;

// TFormTURN は FClient: TsgcTURNClient と FLog: TStringList を保持します

procedure TFormTURN.StartAllocation;
begin
  FClient := TsgcTURNClient.Create(nil);
  FClient.Host := 'turn.example.com';
  FClient.Port := 3478;
  FClient.TURNOptions.Authentication.Credentials := stauLongTermCredential;
  FClient.TURNOptions.Authentication.Username := 'alice';
  FClient.TURNOptions.Authentication.Password := 'secret';

  FClient.OnTURNAllocate := OnTURNAllocate;

  FClient.Allocate;
end;

procedure TFormTURN.OnTURNAllocate(Sender: TObject;
  const aSocket: TsgcSocketConnection;
  const aMessage: TsgcSTUN_Message;
  const aAllocation: TsgcTURN_ResponseAllocation);
begin
  FLog.Add('relay: ' + aAllocation.RelayedIP + ':' +
    IntToStr(aAllocation.RelayedPort));

  // リレーは、許可を与えたピアに対してのみ転送します
  FClient.CreatePermission('192.0.2.1');
  FClient.SendIndication('192.0.2.1', 5000, 'hello via TURN');
end;
// includes: sgcP2P.hpp, sgcP2P_STUN_Types.hpp, sgcP2P_TURN_Classes.hpp
TsgcTURNClient *Client = new TsgcTURNClient(this);
Client->Host = "turn.example.com";
Client->Port = 3478;
Client->TURNOptions->Authentication->Credentials = stauLongTermCredential;
Client->TURNOptions->Authentication->Username = "alice";
Client->TURNOptions->Authentication->Password = "secret";
Client->OnTURNAllocate = OnTURNAllocate;
Client->Allocate();

主な機能

型付きの RFC 8656 TURN クライアントです。STUN のみによる NAT トラバーサルが失敗した場合に、WebRTC のリレー層として機能します。

Allocate / Refresh

Allocate は REQUESTED-TRANSPORT を指定して Allocate リクエストを送信し、リレーされたトランスポートアドレスを取得します。アドレスは OnTURNAllocateaAllocation.RelayedIPRelayedPort として到達します。Refresh(lifetime) は有効期限を延長し、Refresh(0) は割り当てを解除します。

CreatePermission

CreatePermission(peerIp) によって、リレーが転送を許可するピアを登録します。権限は 5 分後に自動的に失効するため、必要に応じて更新してください。

ChannelBind

ChannelBind(peerIp, peerPort) を使うと、36 バイトの Send/Data オーバーヘッドを回避できます。コンポーネントがチャネル番号を選択し、4 バイトの ChannelData ヘッダーをエンコードして、バインディングを OnTURNChannelBind で通知します。

長期認証情報

TURNOptions.Authentication.UsernamePassword は、401 チャレンジから取得した realm と nonce を用いて MESSAGE-INTEGRITY を生成します。Credentials で短期か長期かを選択します。

TCP 上の TURN

Transport := stunTCP を設定すると、UDP がブロックされるネットワーク向けに制御チャネルを TCP へ移します。これが RFC 6062 の経路です。TURNOptions.AutoRefresh を有効にすれば、割り当て、パーミッション、チャネルは自動的に維持されます。

WebRTC 対応

TsgcICEClientTURNClient プロパティを通じて TURN クライアントを制御し、TsgcRTCPeerConnectionRTCOptions.ICEServersturn: エントリから割り当てを行います。Allocate、CreatePermission、ChannelBind の一連の処理は自動的に実行されます。

仕様と参考資料

このコンポーネントが実装するプロトコルの一次資料です。

ドキュメントとデモ

コンポーネントリファレンスへのディープリンク、すぐに実行可能なデモプロジェクト、そして体験版のダウンロードはこちらです。

オンラインヘルプ — TsgcTURNClient 本コンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。
デモプロジェクト — Demos\35.P2P\03.TURN すぐに実行可能なサンプルプロジェクトです。sgcWebSockets パッケージに同梱されています。下記より体験版をダウンロードしてください。
技術ドキュメント (PDF) 本コンポーネントのみを対象とした機能解説、クイックスタート、Delphi および C++ Builder のコードサンプル、一次資料への参照を収録しています。
ユーザーマニュアル (PDF) ライブラリ内のすべてのコンポーネントを網羅した総合マニュアルです。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

Delphi から TURN を利用しませんか?

体験版をダウンロードして、Delphi アプリケーションに TURN ベースのリレー機能を追加しましょう。