ruknet 0.1.0

The perfect reimplementation of the RakNet protocol in Rust
Documentation
# RukNet


RukNet is the first perfect reimplementation of the RakNet protocol in Rust. It provides a robust and efficient networking library for Rust developers requiring RakNet compatibility.

## Overview


RukNet implements most features of the RakNet protocol while intentionally omitting certain features such as:

- `security`: Encryption and decryption of packets. This feature is planned for future implementation but is not a current priority.
- `receipt`: Ack of messages for application layer. This feature is not implemented as it is deemed unnecessary.

Other notable improvements include enhanced performance using optimized algorithms and a single-threaded design.

## Feature


- `RakNet Protocol Compatibility`: Supports core RakNet messaging and connection mechanisms.
- `Asynchronous Networking`: Built on top of Tokio for async operations.
- `Customizable Congestion Control`: Choose between UDT and Sliding Window congestion control algorithms.
- `Configurable Logging`: Enable debug logging for detailed information.

## Installation


To use RukNet in your project, add the following to your `Cargo.toml`:

```toml
[dependencies]
ruknet = "0.1.0"
```

## Usage


> [!NOTE]
> RukNet is still under active development. Please refer to the source code for more detailed insights.

### Server


Simple example of a server that listens for incoming connections, and sends a "ping response" in UnconnectedPong message when a client sends an UnconnectedPing message.

In Minecraft Bedrock Edition, this is used to determine the latency between the client and the server and to display the server's MOTD.

```rust
use ruknet::Peer;

#[tokio::main]

fn main() {
    let mut peer = Peer::new("127.0.0.1:19132", "ping response").await.unwrap();
    // listen with maximum number of connections set to 10
    peer.listen(10).await.unwrap();

    loop {
        tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
        
        // receive up to 32 messages
        let msgs = peer.recv_many(32);

        for msg in msgs {
            println!("Received: {}", msg);
        }
    }
}
```

### Client


```rust
use ruknet::Peer;

#[tokio::main]

async fn main() {
    let mut peer = Peer::new("(your local address)", "ping response").await.unwrap();
    peer.listen(1).await.unwrap();

    peer.connect("(server address)").unwrap();

    loop {
        tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;

        // receive up to 32 messages
        let msgs = peer.recv_many(32);

        for msg in msgs {
            println!("Received: {}", msg);
        }
    }
}
```

## Configuration


- `debug`: Enables debug logging. Disabled by default.
- `udt`: Toggles the use of UDT congestion control instead of the default Sliding Window algorithm.

## Contributing


Contributions are welcome! Feel free to open an issue or submit a pull request.

## License


RukNet is licensed under the MIT license. See [LICENSE](LICENSE) for more details.