Delphi STUN 客户端
使用类型化的 STUN(RFC 8489)客户端发现 NAT 后的反射端点。用作 ICE 候选收集和 WebRTC 的引导步骤。
使用类型化的 STUN(RFC 8489)客户端发现 NAT 后的反射端点。用作 ICE 候选收集和 WebRTC 的引导步骤。
STUN 客户端 — 绑定请求、XOR-MAPPED-ADDRESS 提取、MESSAGE-INTEGRITY / FINGERPRINT 支持,按 RFC 8489 的重传计时器。
TsgcSTUNClient
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 向 Host / Port 发送 STUN 0x0001 绑定消息,而 SendBindingRequest(host, port) 通过同一套接字查询另一台服务器。响应在 OnSTUNResponseSuccess 中到达,其中的 XOR-MAPPED-ADDRESS 已解析完毕。
将 STUNOptions.Authentication.Credentials 设置为 stauShortTermCredential 或 stauLongTermCredential,填写 Username 和 Password,组件即会计算 MESSAGE-INTEGRITY。realm 和 nonce 来自 401 质询响应。
STUN over UDP 需要应用层重传。RetransmissionOptions.RTO 和 MaxRetries 驱动 RFC 8489 §6.2.1 规定的退避,而当您希望自行控制时序时,可用 Enabled 将其关闭。
XOR-MAPPED-ADDRESS 可能以任一地址族返回。组件对两者都能解码,并在 aBinding.RemoteIP 中提供文本形式,地址族则位于 aBinding.IPVersion 中。
针对多个 STUN 服务器驱动多个 TsgcSTUNClient 实例,为每个本地接口收集服务器反射 ICE 候选。
内部使用 TsgcUDPClient,而 Transport := stunTCP 可切换到 TCP 路径。GetLocalSocketBinding 返回该套接字的传输地址,也就是通过它收集的每个候选所共享的 RFC 8445 基地址。