65.9K
CodeProject 正在变化。 阅读更多。
Home

Stunner:一个 STUN 库和客户端

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.58/5 (8投票s)

2008年2月7日

CPOL

2分钟阅读

viewsIcon

70250

downloadIcon

2513

Stunner 是一个简单的 STUN 库,在其之上构建了一个 STUN 客户端。

引言

Stunner 是一个用 C++ 构建的简单 STUN 库和客户端,它可以帮助确定 NAT 类型、STUN 映射的 IP 地址和端口。我将其作为一项练习,因此它基于 RFC 3489。如果感兴趣的人足够多,我可能会致力于支持最新的 STUN 草案。它不支持 RFC 3489 中描述的共享密钥请求和响应。主要原因是,我没有看到任何需要或支持共享密钥请求的 STUN 服务器。同样,如果感兴趣的人足够多,我也会添加此功能。所有用于解析和发送 STUN 请求和响应的基本类都已经存在,因此基于该库构建 STUN 服务器应该相当容易。该库是单线程的,并使用 WinSock 函数的 select I/O 模型。

背景

如果您不确定 STUN 是什么,请参阅 RFC 3489

使用 STUN 客户端

要确定 NAT 类型和 STUN 映射的 IP 地址,您可以调用以下函数

CStunClientHelper clientHelper ("stun.xten.com"); 
NAT_TYPE Nat = clientHelper.GetNatType (); 
SOCKADDR_IN addr; 
clientHelper.GetStunMappedAddress (&addr); 

GetNatType 函数执行 RFC 3489 中描述的测试,而 GetStunMappedAddress 函数通过发送绑定请求来获取公共 IP 地址。

关注点

如果未能获得请求的响应,我们不会像 RFC 3489 中指定的八次那样重试,而是仅尝试三次。此外,我们不会在收到响应后的十分钟内等待并检查所有后续响应是否具有相同的 IP 地址并执行 RFC 3489 中描述的其他验证。这样做是为了使 STUN 客户端能够及时返回,以便应用程序可以使用结果,但是如果您想要 RFC 3489 中描述的行为,请将 STRICT_IMPLEMENTATION 添加到预处理器定义中。对于将日志记录到文件,请将 LOG_TO_FILE 添加到预处理器定义中。

历史

  • 2008 年 2 月 7 日:发布第一个版本
© . All rights reserved.