1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//! Reliudp: A custom Reliable UDP protocol for Rust
//!
//! # Examples
//! 
//! ## Server
//!
//! ```rust,no-run
//! extern crate reliudp;
//! use std::sync::Arc;
//! 
//! fn generate_really_big_message(i: u8) -> Arc<[u8]> {
//!     let really_big_message: Vec<u8> = (0..2000).map(|_v| i).collect();
//!     let really_big_message: Arc<[u8]> = Arc::from(really_big_message.into_boxed_slice());
//!     really_big_message
//! }
//! 
//! fn main() -> Result<(), Box<::std::error::Error>> {
//!     let mut server = reliudp::RUdpServer::new("0.0.0.0:61244").expect("Failed to create server");
//! 
//!     let mut n = 0;
//!     for i in 0u64.. {
//!         server.next_tick()?;
//!         for server_event in server.drain_events() {
//!             println!("Server: Incoming event {:?}", server_event);
//!         }
//! 
//!         if i % 300 == 0 {
//!             let big_message = generate_really_big_message(n);
//!             println!("Sending (n={:?}) {:?} bytes to all {:?} remotes", n, big_message.as_ref().len(), server.remotes_len());
//!             if n % 2 == 0 {
//!                 server.send_data(&big_message, reliudp::MessageType::KeyMessage);
//!             } else {
//!                 server.send_data(&big_message, reliudp::MessageType::Forgettable);
//!             }
//!             n += 1;
//!         }
//!         
//!         ::std::thread::sleep(::std::time::Duration::from_millis(5));
//!     }
//!     Ok(())
//! }
//! ```
//!
//! ## Client
//!
//! ```rust,no-run
//! extern crate reliudp;
//! use reliudp::SocketEvent;
//! 
//! fn main() -> Result<(), Box<::std::error::Error>> {
//!     let mut client = reliudp::RUdpSocket::connect("91.121.135.70:61244").expect("Failed to create client");
//!     for i in 0.. {
//!         client.next_tick()?;
//!         for client_event in client.drain_events() {
//!             if let SocketEvent::Data(d) = client_event {
//!                 println!("Client: Incoming {:?} bytes (n={:?}) at frame {:?}", d.len(), d[0], i);
//!             } else {
//!                 println!("Client: Incoming event {:?} at frame {:?}", client_event, i);
//!             }
//!         }
//! 
//!         ::std::thread::sleep(::std::time::Duration::from_millis(5));
//!     }
//!     Ok(())
//! }
//! ```

extern crate fnv;

extern crate itertools;

extern crate crc;
extern crate byteorder;

extern crate hex;

/// TODO: reorganize stuff.
/// Stuff is working, but it's really not well organized at all. A refactor will be needed
/// (at least name-wise, but also to define precisely which module has which limits and which role)

mod misc;
mod consts;
mod fragment_combiner;
mod fragment_generator;
mod fragment;
mod udp_packet;
mod rudp;
mod udp_packet_handler;
mod rudp_server;
mod ack;
mod sent_data_tracker;
mod ping_handler;

pub use rudp::*;
pub use rudp_server::*;