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 个直接)
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