rustun
v0.5.0
一個用於實現昏迷服務器和客戶端的銹庫。
文件
眩暈協議在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([])) }]
}))