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
impl RUdpSocket
Sourcepub fn connect<A: ToSocketAddrs>(remote_addr: A) -> IoResult<RUdpSocket>
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?
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
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}Sourcepub fn set_timeout_delay(&mut self, timeout_delay: u64)
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.
pub fn set_timeout_delay_with( &mut self, milliseconds: u64, tick_interval_milliseconds: u64, )
Sourcepub fn set_heartbeat_delay(&mut self, heartbeat_delay: u64)
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.
pub fn set_heartbeat_delay_with( &mut self, milliseconds: u64, heartbeat_interval_milliseconds: u64, )
Sourcepub fn drain_events<'a>(&'a mut self) -> impl Iterator<Item = SocketEvent> + 'a
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?
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
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}Sourcepub fn next_event(&mut self) -> Option<SocketEvent>
pub fn next_event(&mut self) -> Option<SocketEvent>
Gets the next socket event for this socket.
Sourcepub fn send_data(&mut self, data: Arc<[u8]>, message_type: MessageType)
pub fn send_data(&mut self, data: Arc<[u8]>, message_type: MessageType)
Send data to the remote.
Examples found in repository?
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}Sourcepub fn send_end(&mut self) -> Result<()>
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.
Sourcepub fn terminate(self) -> IoResult<()>
pub fn terminate(self) -> IoResult<()>
Terminates the socket, by sending a “Ended” event to the remote.
Sourcepub fn ping(&self) -> Option<u32>
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?
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}Sourcepub fn next_tick(&mut self) -> IoResult<()>
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?
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
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}pub fn status(&self) -> SocketStatus
Sourcepub fn should_clear(&self) -> bool
pub fn should_clear(&self) -> bool
Returns whether or not you should clear this RUdp client.