Struct RUdpSocket

Source
pub struct RUdpSocket { /* private fields */ }
Expand description

A RUdp Client Socket

Represents a connection between you (the host) and the remote. You can send messages, receive messages and poll it for various events.

Once dropped, the socket will send a “terminate” message to the remote before shutting down.

A RUdpServer holds 0, 1 or more of them.

Implementations§

Source§

impl RUdpSocket

Source

pub fn connect<A: ToSocketAddrs>(remote_addr: A) -> IoResult<RUdpSocket>

Creates a Socket and connects to the remote instantly.

This will fail ONLY if there is something wrong with the network, preventing it to create a UDP Socket. This is NOT blocking, so any timeout event or things or the like will arrive as SocketEvents.

The socket will be created with the status SynSent, after which there will be 2 outcomes:

  • The remote answered SynAck, and we set the status as “Connected”
  • The remote did not answer, and we will get a timeout
Examples found in repository?
examples/client.rs (line 5)
4fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
5    let mut client = reliudp::RUdpSocket::connect("127.0.0.1:61244").expect("Failed to create client");
6    for i in 0.. {
7        client.next_tick()?;
8        // if i % 10 == 0 { dbg!(client.status()); }
9        for client_event in client.drain_events() {
10            if let SocketEvent::Data(d) = client_event {
11                println!("Client: Incoming {:?} bytes (n={:?}) at frame {:?}", d.len(), d[0], i);
12            } else {
13                println!("Client: Incoming event {:?} at frame {:?}", client_event, i);
14            }
15        }
16        
17        ::std::thread::sleep(::std::time::Duration::from_millis(5));
18    }
19    Ok(())
20}
More examples
Hide additional examples
examples/simple.rs (line 11)
5fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
6    let really_big_message: Vec<u8> = (0..65536).map(|v| (v % 256) as u8).collect();
7    let really_big_message: Arc<[u8]> = Arc::from(really_big_message.into_boxed_slice());
8
9    let mut server = reliudp::RUdpServer::new("0.0.0.0:50000").expect("Failed to create server");
10
11    let mut client = reliudp::RUdpSocket::connect("192.168.1.89:50000").expect("Failed to create client");
12
13    let mut sent_message: bool = false;
14
15    println!("Created server & client. Starting main loop");
16    for _frame in 0..300 {
17        server.next_tick()?;
18        client.next_tick()?;
19
20        for client_event in client.drain_events() {
21            println!("Client: Incoming event {:?}", client_event);
22        }
23
24        for server_event in server.drain_events() {
25            println!("Server: Incoming event {:?}", server_event);
26        }
27        
28        if !sent_message {
29            client.send_data(Arc::clone(&really_big_message), reliudp::MessageType::KeyMessage);
30            sent_message = true;
31        }
32
33        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
34    }
35
36    {
37        // drop the server;
38        let _s = server;
39    }
40    
41    for _frame in 0..10 {
42        client.next_tick()?;
43
44        for client_event in client.drain_events() {
45            println!("Client: Incoming event {:?}", client_event);
46        }
47        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
48    }
49
50    println!("Done.");
51    Ok(())
52}
Source

pub fn set_timeout_delay(&mut self, timeout_delay: u64)

Set the number of iterations required before a remote is set as “dead”.

For instance, if your tick is every 50ms, and your timeout_delay is of 24, then roughly 50*24=1200ms (=1.2s) without a message from the remote will cause a timeout error.

Source

pub fn set_timeout_delay_with( &mut self, milliseconds: u64, tick_interval_milliseconds: u64, )

Source

pub fn set_heartbeat_delay(&mut self, heartbeat_delay: u64)

Set the number of iterations required before we send a “heartbeat” message to the remote, to make sure they don’t consider us as timed out.

Source

pub fn set_heartbeat_delay_with( &mut self, milliseconds: u64, heartbeat_interval_milliseconds: u64, )

Source

pub fn drain_events<'a>(&'a mut self) -> impl Iterator<Item = SocketEvent> + 'a

Drains socket events for this Socket.

This is one of the 2 ways to loop over all incoming events. See the examples for how to use it.

Examples found in repository?
examples/client.rs (line 9)
4fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
5    let mut client = reliudp::RUdpSocket::connect("127.0.0.1:61244").expect("Failed to create client");
6    for i in 0.. {
7        client.next_tick()?;
8        // if i % 10 == 0 { dbg!(client.status()); }
9        for client_event in client.drain_events() {
10            if let SocketEvent::Data(d) = client_event {
11                println!("Client: Incoming {:?} bytes (n={:?}) at frame {:?}", d.len(), d[0], i);
12            } else {
13                println!("Client: Incoming event {:?} at frame {:?}", client_event, i);
14            }
15        }
16        
17        ::std::thread::sleep(::std::time::Duration::from_millis(5));
18    }
19    Ok(())
20}
More examples
Hide additional examples
examples/simple.rs (line 20)
5fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
6    let really_big_message: Vec<u8> = (0..65536).map(|v| (v % 256) as u8).collect();
7    let really_big_message: Arc<[u8]> = Arc::from(really_big_message.into_boxed_slice());
8
9    let mut server = reliudp::RUdpServer::new("0.0.0.0:50000").expect("Failed to create server");
10
11    let mut client = reliudp::RUdpSocket::connect("192.168.1.89:50000").expect("Failed to create client");
12
13    let mut sent_message: bool = false;
14
15    println!("Created server & client. Starting main loop");
16    for _frame in 0..300 {
17        server.next_tick()?;
18        client.next_tick()?;
19
20        for client_event in client.drain_events() {
21            println!("Client: Incoming event {:?}", client_event);
22        }
23
24        for server_event in server.drain_events() {
25            println!("Server: Incoming event {:?}", server_event);
26        }
27        
28        if !sent_message {
29            client.send_data(Arc::clone(&really_big_message), reliudp::MessageType::KeyMessage);
30            sent_message = true;
31        }
32
33        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
34    }
35
36    {
37        // drop the server;
38        let _s = server;
39    }
40    
41    for _frame in 0..10 {
42        client.next_tick()?;
43
44        for client_event in client.drain_events() {
45            println!("Client: Incoming event {:?}", client_event);
46        }
47        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
48    }
49
50    println!("Done.");
51    Ok(())
52}
Source

pub fn next_event(&mut self) -> Option<SocketEvent>

Gets the next socket event for this socket.

Source

pub fn send_data(&mut self, data: Arc<[u8]>, message_type: MessageType)

Send data to the remote.

Examples found in repository?
examples/simple.rs (line 29)
5fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
6    let really_big_message: Vec<u8> = (0..65536).map(|v| (v % 256) as u8).collect();
7    let really_big_message: Arc<[u8]> = Arc::from(really_big_message.into_boxed_slice());
8
9    let mut server = reliudp::RUdpServer::new("0.0.0.0:50000").expect("Failed to create server");
10
11    let mut client = reliudp::RUdpSocket::connect("192.168.1.89:50000").expect("Failed to create client");
12
13    let mut sent_message: bool = false;
14
15    println!("Created server & client. Starting main loop");
16    for _frame in 0..300 {
17        server.next_tick()?;
18        client.next_tick()?;
19
20        for client_event in client.drain_events() {
21            println!("Client: Incoming event {:?}", client_event);
22        }
23
24        for server_event in server.drain_events() {
25            println!("Server: Incoming event {:?}", server_event);
26        }
27        
28        if !sent_message {
29            client.send_data(Arc::clone(&really_big_message), reliudp::MessageType::KeyMessage);
30            sent_message = true;
31        }
32
33        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
34    }
35
36    {
37        // drop the server;
38        let _s = server;
39    }
40    
41    for _frame in 0..10 {
42        client.next_tick()?;
43
44        for client_event in client.drain_events() {
45            println!("Client: Incoming event {:?}", client_event);
46        }
47        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
48    }
49
50    println!("Done.");
51    Ok(())
52}
Source

pub fn send_end(&mut self) -> Result<()>

Same as terminate, but leave the Socket alive.

This is mostly useful if you want to still receive the data the other remote is currently sending at this time. However, note that no acks will be sent, so its usefulness is still limited.

Source

pub fn terminate(self) -> IoResult<()>

Terminates the socket, by sending a “Ended” event to the remote.

Source

pub fn ping(&self) -> Option<u32>

Returns the ping to the remote as ms

Returns None if the ping has not been computed yet

Examples found in repository?
examples/server.rs (line 31)
10fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
11    let mut server = reliudp::RUdpServer::new("0.0.0.0:61244").expect("Failed to create server");
12
13    let mut n = 0;
14    for i in 0u64.. {
15        server.next_tick()?;
16        for server_event in server.drain_events() {
17            println!("Server: Incoming event {:?}", server_event);
18        }
19
20        if i % 300 == 0 && server.remotes_len() > 0 {
21            let big_message = generate_really_big_message(n);
22            println!("Sending (n={:?}) {:?} bytes to all {:?} remotes", n, big_message.as_ref().len(), server.remotes_len());
23            if n % 2 == 0 {
24                server.send_data(&big_message, reliudp::MessageType::KeyMessage);
25            } else {
26                server.send_data(&big_message, reliudp::MessageType::Forgettable);
27            }
28            n += 1;
29
30            for (address, socket) in server.iter() {
31                println!("\tPing to remote {:?} is {:?}", address, socket.ping());
32            }
33        }
34        
35        ::std::thread::sleep(::std::time::Duration::from_millis(5));
36    }
37    Ok(())
38}
Source

pub fn next_tick(&mut self) -> IoResult<()>

Internal processing for this single source

Must be done before draining events. Even if there are no events, you will want to re-send acks, keep track of sent data, etc. next_tick does that for you.

Do NOT use this method if you have multiple remotes for a single UdpSocket (a single port): all packets not coming from the right remote (matching IP and port) will be discarded! This warning applies if this socket has been borrowed from a RUdpServer as well, because all the remotes are sharing the same port.

Examples found in repository?
examples/client.rs (line 7)
4fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
5    let mut client = reliudp::RUdpSocket::connect("127.0.0.1:61244").expect("Failed to create client");
6    for i in 0.. {
7        client.next_tick()?;
8        // if i % 10 == 0 { dbg!(client.status()); }
9        for client_event in client.drain_events() {
10            if let SocketEvent::Data(d) = client_event {
11                println!("Client: Incoming {:?} bytes (n={:?}) at frame {:?}", d.len(), d[0], i);
12            } else {
13                println!("Client: Incoming event {:?} at frame {:?}", client_event, i);
14            }
15        }
16        
17        ::std::thread::sleep(::std::time::Duration::from_millis(5));
18    }
19    Ok(())
20}
More examples
Hide additional examples
examples/simple.rs (line 18)
5fn main() -> Result<(), Box<dyn (::std::error::Error)>> {
6    let really_big_message: Vec<u8> = (0..65536).map(|v| (v % 256) as u8).collect();
7    let really_big_message: Arc<[u8]> = Arc::from(really_big_message.into_boxed_slice());
8
9    let mut server = reliudp::RUdpServer::new("0.0.0.0:50000").expect("Failed to create server");
10
11    let mut client = reliudp::RUdpSocket::connect("192.168.1.89:50000").expect("Failed to create client");
12
13    let mut sent_message: bool = false;
14
15    println!("Created server & client. Starting main loop");
16    for _frame in 0..300 {
17        server.next_tick()?;
18        client.next_tick()?;
19
20        for client_event in client.drain_events() {
21            println!("Client: Incoming event {:?}", client_event);
22        }
23
24        for server_event in server.drain_events() {
25            println!("Server: Incoming event {:?}", server_event);
26        }
27        
28        if !sent_message {
29            client.send_data(Arc::clone(&really_big_message), reliudp::MessageType::KeyMessage);
30            sent_message = true;
31        }
32
33        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
34    }
35
36    {
37        // drop the server;
38        let _s = server;
39    }
40    
41    for _frame in 0..10 {
42        client.next_tick()?;
43
44        for client_event in client.drain_events() {
45            println!("Client: Incoming event {:?}", client_event);
46        }
47        ::std::thread::sleep(::std::time::Duration::from_micros(16666));
48    }
49
50    println!("Done.");
51    Ok(())
52}
Source

pub fn status(&self) -> SocketStatus

Source

pub fn should_clear(&self) -> bool

Returns whether or not you should clear this RUdp client.

Source

pub fn local_addr(&self) -> SocketAddr

Source

pub fn remote_addr(&self) -> SocketAddr

Trait Implementations§

Source§

impl Debug for RUdpSocket

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for RUdpSocket

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.