Dark Mode

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

sile/rustun

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

179 Commits

Repository files navigation

rustun

A Rust library for implementing STUN server and client asynchronously.

Documentation

The STUN protocol is defined in RFC 5389.

Examples

An example that issues a BINDING request:

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());

You can run example server and client which handle Binding method as follows:

// 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([])) }]
}))

About

A Rust library for implementing STUN server and client asynchronously

Topics

Resources

Readme

License

MIT license

Stars

Watchers

Forks

Packages

Contributors

Languages