RakNet icon indicating copy to clipboard operation
RakNet copied to clipboard

Add support for splittings conns

Open theaddonn opened this issue 1 year ago • 4 comments

In an async server software you often have a loop which recv packets and some sort of client struct that contains a way to send packets. This would mean we would either need to copy/clone the connection or split it.

Tokio's tcp stream has a nice way to split it into a recv half and write half.

use tokio::prelude::*;
use tokio::net::TcpStream;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut stream = TcpStream::connect("localhost:8080").await?;
    let (mut read, mut write) = tokio::io::split(stream);

    tokio::spawn(async move {
        loop {
            let mut buf = [0u8; 32];
            read.read(&mut buf).await.unwrap();
            println!("{:?}", std::str::from_utf8(&buf));
        }
    });

    Ok(())
}

this code is from stack overflow

Even though Raknet uses udp it would still be nice if an api for splitting the connection or copying/cloning it would be added. This is very important for writing effiecient server software that utilise multi threading.

theaddonn avatar Apr 27 '24 11:04 theaddonn

This is technically already supported internally, however this does add some refactoring and would require an API minor bump since this change would break the current API. I will look into this, but this change will target 0.4.0 rather than 0.3.0

john-bv avatar Apr 28 '24 19:04 john-bv

how is this looking?

theaddonn avatar Jun 12 '24 17:06 theaddonn

I will work on this sometime in July, I'm currently way to busy figuring out IRL stuff, I apologize.

john-bv avatar Jun 13 '24 22:06 john-bv

After careful consideration, this change may not be needed. I looked into this further and one simple solution stuck out to me. One can simply create a new tokio task and return a clonable object full with channels to communicate with that task, to for example send packets, recieve packets or close the connection. This type of impl would not need any split cabability. I used this solution a lot and it works great.

It might be useful creating an example for that. I hope I can look into it, once I got the time.

theaddonn avatar Jun 29 '24 13:06 theaddonn