rustun
v0.5.0
Une bibliothèque de rouille pour implémenter le serveur Stun et le client de manière asynchrone.
Documentation
Le protocole Stun est défini dans RFC 5389.
Un exemple qui émet une demande 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 ( ) ) ; Vous pouvez exécuter l'exemple de serveur et le client qui gèrent la méthode Binding comme suit:
// 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([])) }]
}))