1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//! Asynchronous implementation of STUN [[RFC 5389](https://tools.ietf.org/html/rfc5389)]
//! server and client.
//!
//! # Examples
//!
//! A client-side example that issues a Binding request:
//!
//! ```no_run
//! extern crate fibers;
//! extern crate rustun;
//!
//! use fibers::{Executor, InPlaceExecutor, Spawn};
//! use rustun::{Method, Client};
//! use rustun::client::UdpClient;
//! use rustun::rfc5389;
//!
//! fn main() {
//! let server_addr = "127.0.0.1:3478".parse().unwrap();
//! let mut executor = InPlaceExecutor::new().unwrap();
//!
//! let mut client = UdpClient::new(&executor.handle(), server_addr);
//! let request = rfc5389::methods::Binding.request::<rfc5389::Attribute>();
//! let future = client.call(request);
//!
//! let monitor = executor.spawn_monitor(future);
//! match executor.run_fiber(monitor).unwrap() {
//! Ok(v) => println!("OK: {:?}", v),
//! Err(e) => println!("ERROR: {}", e),
//! }
//! }
//! ```
//!
//! You can run example server and client which handle `Binding` method as follows:
//!
//! ```bash
//! # 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: Ok(SuccessResponse {
//! method: Binding,
//! transaction_id: [246, 217, 191, 180, 118, 246, 250, 168, 86, 124, 126, 130],
//! attributes: [XorMappedAddress(XorMappedAddress(V4(127.0.0.1:61991)))]
//! })
//! ```
extern crate crc;
extern crate md5;
extern crate hmacsha1;
extern crate slog;
extern crate rand;
extern crate fibers;
extern crate futures;
extern crate trackable;
extern crate handy_async;
pub use ;
pub use Client;
pub use HandleMessage;
pub use Method;
pub use Attribute;
pub use Transport;
/// A specialized `Result` type for this crate.
pub type Result<T> = Result;