20个版本
0.5.0 | 2024年2月23日 |
---|---|
0.4.0 | 2022年3月18日 |
0.3.7 | 2020年9月11日 |
0.3.5 | 2018年10月23日 |
0.1.4 | 2017年3月19日 |
#523 in 网络编程
在 rusturn 中使用
79KB
1.5K SLoC
rustun
一个用于异步实现STUN服务器和客户端的Rust库。
STUN协议定义在RFC 5389。
示例
一个发出BINDING
请求的示例
use fibers_transport::UdpTransporter;
use futures::Future;
use rustun::channel::Channel;
use rustun::client::Client;
use rustun::message::Request;
use rustun::server::{BindingHandler, UdpServer};
use rustun::transport::StunUdpTransporter;
use rustun::Error;
use stun_codec::{rfc5389, MessageDecoder, MessageEncoder};
let addr = "127.0.0.1:0".parse().unwrap();
// Starts UDP server
let server = fibers_global::execute(UdpServer::start(fibers_global::handle(), addr, BindingHandler))?;
let server_addr = server.local_addr();
fibers_global::spawn(server.map(|_| ()).map_err(|e| panic!("{}", e)));
// Sents BINDING request
let response = UdpTransporter::<MessageEncoder<_>, MessageDecoder<_>>::bind(addr)
.map_err(Error::from)
.map(StunUdpTransporter::new)
.map(Channel::new)
.and_then(move |channel| {
let client = Client::new(&fibers_global::handle(), channel);
let request = Request::<rfc5389::Attribute>::new(rfc5389::methods::BINDING);
client.call(server_addr, request)
});
// Waits BINDING response
let response = fibers_global::execute(response)?;
assert!(response.is_ok());
您可以通过以下方式运行示例服务器和客户端,处理Binding
方法:
// Starts the STUN server in a shell.
$ cargo run --example binding_srv
// Executes a STUN client in another shell.
$ cargo run --example binding_cli -- 127.0.0.1
Ok(SuccessResponse(Message {
class: SuccessResponse,
method: Method(1),
transaction_id: TransactionId(0x344A403694972F5E53B69465),
attributes: [Known { inner: XorMappedAddress(XorMappedAddress(V4(127.0.0.1:54754))),
padding: Some(Padding([])) }]
}))
依赖项
~4MB
~83K SLoC