Simple UDP-only STUN client for resolving external IP address:port behind NAT.

Supports both sync and async.

Example (sync):

```rust use std::net::UdpSocket; use stunclient::StunClient; use std::net::{SocketAddr,ToSocketAddrs}; let localaddr : SocketAddr = "0.0.0.0:0".parse().unwrap(); let stunaddr = "stun.counterpath.net:3478".tosocketaddrs().unwrap().filter(|x|x.isipv4()).next().unwrap(); let udp = UdpSocket::bind(localaddr).unwrap();

let c = StunClient::new(stun_addr);

let myexternaladdr = c.queryexternaladdress(&udp).unwrap(); ```

Example (async):

```rust use stunclient::StunClient; use std::net::{SocketAddr,ToSocketAddrs};

let localaddr : SocketAddr = "0.0.0.0:0".parse().unwrap(); let stunaddr = "stun.counterpath.net:3478".tosocketaddrs().unwrap().filter(|x|x.isipv4()).next().unwrap(); let udp = tokio::net::udp::UdpSocket::bind(&localaddr).unwrap();

let c = StunClient::new(stunaddr); let f = c.queryexternaladdressasync(udp); let (udp, myexternaladdr) = tokio::runtime::currentthread::blockon_all(f).unwrap(); ```