Giter VIP home page Giter VIP logo

rustun's Introduction

rustun

Crates.io: rustun Documentation Actions Status Coverage Status License: MIT

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

rustun's People

Contributors

sile avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

rustun's Issues

rustun is crashing

[ERROR] Other (cause; assertion failed: left == right; assertion failed: (left == right) (left: 0, right: 20): self.is_idle()=true)
HISTORY:
[0] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/bytecodec-0.4.13/src/decode.rs:450
[1] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/fibers_transport-0.1.3/src/udp.rs:199 -- peer=V4(180.xxx.xxx.xxx:55567)
[2] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/fibers_transport-0.1.3/src/error.rs:19 -- original_error_kind=InvalidInput
[3] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/transport/udp.rs:358
[4] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/transport/udp.rs:193
[5] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/channel.rs:176
[6] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/error.rs:61 -- original_error_kind=CodecError
[7] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/server.rs:340

Does not currently build

This wants an explicit 'dyn' in src/server.rs:164 and src/server.rs:170 (s/Box<Future/Box<dyn Future/)

That's a quick fix. However being new to rust, this one is less obvious to me -

warning: use of deprecated item 'derive_traits_for_trackable_error_newtype': please use #[derive(TrackableError)] instead
--> src/error.rs:86:1
|
86 | derive_traits_for_trackable_error_newtype!(MessageError, MessageErrorKind);

when I mimic the syntax earlier in the code this gives me 20-odd errors.

How do I get back the UDP socket after getting STUN reply?

In the README example I know the external address of a created UDP socket from XorMappedAddress attribute. But how do I get back the socket to send custom, non-STUN datagrams elsewhere?

Do I need to somehow extract Channel from Client, then UdpTransporter from Channel, then the socket from UdpTransporter?

[ERROR] Other (cause; assertion failed: `left == right`; assertion failed: `(left == right)` (left: `0`, right: `20`): self.is_idle()=true) HISTORY:

[ERROR] Other (cause; assertion failed: left == right; assertion failed: (left == right) (left: 0, right: 20): self.is_idle()=true)
HISTORY:
[0] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/bytecodec-0.4.13/src/decode.rs:450
[1] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/fibers_transport-0.1.3/src/udp.rs:199 -- peer=V4(180.xxx.xxx.xxx:55567)
[2] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/fibers_transport-0.1.3/src/error.rs:19 -- original_error_kind=InvalidInput
[3] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/transport/udp.rs:358
[4] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/transport/udp.rs:193
[5] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/channel.rs:176
[6] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/error.rs:61 -- original_error_kind=CodecError
[7] at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/rustun-0.3.7/src/server.rs:340

Crash when doing local stun request - is this expected?

Scenario:

  • Running stun server with cargo run --example binding_srv
  • clone python stun client from [email protected]:arantonitis/pynat.git (run under python 3)
  • Connect to stun server with this client through python pynat.py --stun-host 0.0.0.0
  • Result:

Error: Other (cause; assertion failed: `left == right`; assertion failed: `(left == right)` (left: `1180954873`, right: `554869826`))
HISTORY:
  [0] at /home/mrjb/.cargo/registry/src/github.com-1ecc6299db9ec823/stun_codec-0.1.12/src/message.rs:287
  [1] at /home/mrjb/.cargo/registry/src/github.com-1ecc6299db9ec823/bytecodec-0.4.13/src/combinator.rs:1369
  [2] at /home/mrjb/.cargo/registry/src/github.com-1ecc6299db9ec823/stun_codec-0.1.12/src/message.rs:424
  [3] at /home/mrjb/.cargo/registry/src/github.com-1ecc6299db9ec823/bytecodec-0.4.13/src/decode.rs:449
  [4] at /home/mrjb/.cargo/registry/src/github.com-1ecc6299db9ec823/fibers_transport-0.1.2/src/udp.rs:200
  [5] at /home/mrjb/.cargo/registry/src/github.com-1ecc6299db9ec823/fibers_transport-0.1.2/src/error.rs:22 -- original_error_kind=InvalidInput
  [6] at src/transport/udp.rs:358
  [7] at src/transport/udp.rs:193
  [8] at src/channel.rs:178
  [9] at src/error.rs:63 -- original_error_kind=CodecError
  [10] at src/server.rs:331
  [11] at src/server.rs:71
  [12] at examples/binding_srv.rs:32

Granted it would be weird to run a stun server and access it from a local client - is this expected?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.