Crates.io | forky-udpflow |
lib.rs | forky-udpflow |
version | 0.2.0 |
source | src |
created_at | 2023-06-03 09:54:16.34033 |
updated_at | 2023-06-07 20:41:01.734884 |
description | Stream API for tokio-udp. |
homepage | |
repository | https://github.com/sabify/udpflow |
max_upload_size | |
id | 881518 |
size | 45,881 |
Stream API for tokio-udp.
use tokio::net::UdpSocket;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use udpflow::{UdpListener, UdpStreamLocal, UdpStreamRemote};
async fn server() {
let addr = "127.0.0.1:5000".parse().unwrap();
let listener = UdpListener::new(addr).unwrap();
loop {
let mut buf = vec![0u8; 0x2000];
let (n, stream, addr) = listener.accept(&mut buf).await.unwrap();
buf.truncate(n);
tokio::spawn(handle(stream, buf));
}
}
async fn handle(mut stream1: UdpStreamLocal, first_packet: Vec<u8>) {
let local = "127.0.0.1:0".parse().unwrap();
let remote = "127.0.0.1:10000".parse().unwrap();
let mut stream2 = UdpStreamRemote::new(local, remote).await.unwrap();
stream2.write_all(&first_packet).await.unwrap();
let mut buf = vec![0u8; 256];
stream1.read(&mut buf).await; stream2.write(&buf).await;
stream2.read(&mut buf).await; stream1.write(&buf).await;
}
use tokio::net::TcpStream;
use udpflow::UotStream;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
async {
let stream = TcpStream::connect("127.0.0.1:8080").await.unwrap();
let mut stream = UotStream::new(stream);
let mut buf = vec![0u8; 256];
// read a frame
let n = stream.read(&mut buf).await.unwrap();
// write a frame
stream.write_all(&buf[..n]).await;
};
+------+----------+
| LEN | DATA |
+------+----------+
| 2 | Variable |
+------+----------+
*LEN is a 16-bit unsigned integer in big endian byte order.