#turn #nat #stun #rfc5766

turnclient

简单的UDP TURN客户端 - 可穿越严格的NAT;仅异步

7个版本 (4个破坏性版本)

0.5.0 2023年3月27日
0.4.0 2021年7月27日
0.3.2 2021年7月27日
0.2.0 2021年7月25日
0.1.0 2019年2月5日

#1288网络编程


用于 3 个包 (2 个直接)

MIT/Apache

51KB
966

简单的Rust TURN (RFC 5766) UDP客户端 - 可穿越严格的NAT;目前仅异步

<bonus> 一个通用的TURN客户端/代理,允许使用TURN进行自定义操作(您提供信令脚本)。在GitHub发布版中有预构建的可执行文件。</bonus>.

清理后的回声示例片段

let udp : tokio::net::UdpSocket; 
let c = turnclient::TurnClientBuilder::new(turn_server, username, password);
let (turnsink, turnstream) = c.build_and_send_request(udp).split();
turnstream.map(move |event| {
    Ok(match event {
        MessageFromTurnServer::AllocationGranted{ relay_address, ..} => {
            MessageToTurnServer::AddPermission(peer_addr, ChannelUsage::WithChannel)
        },
        MessageFromTurnServer::RecvFrom(sa,data) => {
            MessageToTurnServer::SendTo(sa, data)
        },
        _ => MessageToTurnServer::Noop,
    })
}).forward(turnsink).await;

请参阅包级文档以获取更多说明。

未实现 / TODO / 缺点

  • 移除权限。它们会一直刷新,直到你关闭整个分配。
  • 二次方复杂度,在N个活动权限的情况下,UDP数据报的数量是线性的。
  • TCP或TLS传输。
  • 使用短期凭证而不是长期凭证。
  • 在发送的数据报上指定“不要分段”
  • 奇偶端口分配
  • 错误处理是临时的 Box<dyn std::error::Error>,只使用文本字符串。
  • 不检查服务器回复的消息完整性。
  • 使用重量级分配,使用 Vec<u8> 作为字节数据缓冲区。

示例

  • echo.rs - 连接到指定的TURN服务器,授权指定的对等方并作为它的回声服务器(如上所述的片段所示)
  • proxy.rs - 在本地UDP对等方和TURN中介对等方之间交换数据包。当分配可用时执行脚本。

对于旧Rust和Tokio 0.1,有这个包的旧版本 0.1。这个版本可能比当前版本表现更好或更差,我还没有真正检查过。

依赖关系

~5–15MB
~175K SLoC