Delphi STUN クライアント

型付き STUN(RFC 8489)クライアントで NAT 背後のリフレクシブエンドポイントを検出します。ICE 候補収集と WebRTC のブートストラップステップとして使用されます。

TsgcSTUNClient

STUN クライアントです。バインディングリクエスト、XOR-MAPPED-ADDRESS の抽出、MESSAGE-INTEGRITY / FINGERPRINT サポート、RFC 8489 に従った再送タイマーを実装しています。

コンポーネントクラス

TsgcSTUNClient

プロトコル

STUN (RFC 8489)

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Standard / Professional / Enterprise

コンポーネントを配置してリフレクシブアドレスを取得する

STUN サーバーのホストとポートを設定して SendRequest を呼び出し、OnSTUNResponseSuccess で aBinding.RemoteIP と aBinding.RemotePort を読み取ってください。

uses
  sgcP2P, sgcP2P_STUN_Classes, sgcSocket_Classes;

// TFormSTUN は FClient: TsgcSTUNClient と FLog: TStringList を保持します

procedure TFormSTUN.Discover;
begin
  FClient := TsgcSTUNClient.Create(nil);
  FClient.Host := 'stun.l.google.com';
  FClient.Port := 19302;

  FClient.OnSTUNResponseSuccess := OnSTUNResponseSuccess;

  FClient.SendRequest;
end;

procedure TFormSTUN.OnSTUNResponseSuccess(Sender: TObject;
  const aSocket: TsgcSocketConnection;
  const aMessage: TsgcSTUN_Message;
  const aBinding: TsgcSTUN_ResponseBinding);
begin
  // RemoteIP と RemotePort には、サーバーが認識した XOR-MAPPED-ADDRESS が入ります
  FLog.Add('public: ' + aBinding.RemoteIP + ':' +
    IntToStr(aBinding.RemotePort));
end;
// includes: sgcP2P.hpp, sgcP2P_STUN_Classes.hpp
TsgcSTUNClient *Client = new TsgcSTUNClient(this);
Client->Host = "stun.l.google.com";
Client->Port = 19302;
Client->OnSTUNResponseSuccess = OnSTUNResponseSuccess;
Client->SendRequest();

主な機能

ICE で使用されるメッセージ整合性とフィンガープリント拡張を備えた型付き RFC 8489 STUN クライアントです。

バインディングリクエスト / レスポンス

SendRequest は STUN の 0x0001 Binding メッセージを Host / Port へ送信します。SendBindingRequest(host, port) を使えば、同じソケットで別のサーバーに問い合わせできます。レスポンスは、解析済みの XOR-MAPPED-ADDRESS とともに OnSTUNResponseSuccess に到達します。

認証(長期 / 短期)

STUNOptions.Authentication.CredentialsstauShortTermCredential または stauLongTermCredential を設定し、UsernamePassword を指定すると、コンポーネントが MESSAGE-INTEGRITY を計算します。realm と nonce は 401 チャレンジから取得されます。

再送制御

UDP 上の STUN はアプリケーション層の再送を必要とします。RetransmissionOptions.RTOMaxRetries が RFC 8489 §6.2.1 のバックオフを制御し、タイミングを自分で制御する場合は Enabled でオフにできます。

IPv4 / IPv6

XOR-MAPPED-ADDRESS はいずれのアドレスファミリでも返されます。コンポーネントは両方をデコードし、テキスト形式を aBinding.RemoteIP に、アドレスファミリを aBinding.IPVersion に格納します。

ICE ホスト候補収集器としての使用

複数の TsgcSTUNClient インスタンスを複数の STUN サーバーに向けて実行し、ローカルインターフェースごとにサーバーリフレクシブ ICE 候補を収集します。

基底ソケット

内部で TsgcUDPClient を使用します。Transport := stunTCP を設定すると TCP 経路に切り替わります。GetLocalSocketBinding はそのソケットのトランスポートアドレスを返します。これは、そのソケットで収集したすべての候補が共有する RFC 8445 のベースです。

仕様・参考資料

このコンポーネントが実装するプロトコルの公式ソースです。

ドキュメント・デモ

コンポーネントリファレンスへの直接リンク、すぐに実行できるデモプロジェクトの入手、体験版のダウンロードができます。

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

NAT マッピングを検出しませんか?

体験版をダウンロードして、Delphi アプリケーションに STUN ベースの NAT 検出を追加してください。