From f160c0fa78744b337f03b619e2d8b61ed916402b Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Wed, 28 Dec 2022 23:30:02 +0100 Subject: fix async --- Cargo.toml | 1 + src/client.rs | 2 ++ src/main.rs | 17 ++++++++++++++--- src/recv_worker.rs | 4 +--- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 55cc8ff..2947bad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +async-trait = "0.1.60" byteorder = "1.4.3" num_enum = "0.5.7" tokio = { version = "1.23.0", features = ["full"] } diff --git a/src/client.rs b/src/client.rs index 97a18d7..d416e53 100644 --- a/src/client.rs +++ b/src/client.rs @@ -6,6 +6,7 @@ pub struct Sender { sock: Arc, } +#[async_trait] impl UdpSender for Sender { async fn send(&self, data: Vec) -> io::Result<()> { self.sock.send(&data).await?; @@ -17,6 +18,7 @@ pub struct Receiver { sock: Arc, } +#[async_trait] impl UdpReceiver for Receiver { async fn recv(&self) -> io::Result> { let mut buffer = Vec::new(); diff --git a/src/main.rs b/src/main.rs index 241d324..a190bcd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ #![feature(yeet_expr)] #![feature(cursor_remaining)] #![feature(hash_drain_filter)] -#![feature(async_fn_in_trait)] mod client; pub mod error; mod recv_worker; +use async_trait::async_trait; use byteorder::{BigEndian, WriteBytesExt}; pub use client::{connect, Sender as Client}; use num_enum::TryFromPrimitive; @@ -24,10 +24,12 @@ pub const REL_BUFFER: usize = 0x8000; pub const INIT_SEQNUM: u16 = 65500; pub const TIMEOUT: u64 = 30; +#[async_trait] pub trait UdpSender: Send + Sync + 'static { async fn send(&self, data: Vec) -> io::Result<()>; } +#[async_trait] pub trait UdpReceiver: Send + Sync + 'static { async fn recv(&self) -> io::Result>; } @@ -118,6 +120,12 @@ impl ops::Deref for RudpReceiver { } } +impl ops::DerefMut for RudpReceiver { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.pkt_rx + } +} + pub fn new( id: u16, remote_id: u16, @@ -134,7 +142,10 @@ pub fn new( }); let recv_share = Arc::clone(&share); - tokio::spawn(async { recv_worker::RecvWorker::new(udp_rx, recv_share, pkt_tx).await }); + tokio::spawn(async { + let worker = recv_worker::RecvWorker::new(udp_rx, recv_share, pkt_tx); + worker.run().await; + }); ( RudpSender { @@ -149,7 +160,7 @@ pub fn new( #[tokio::main] async fn main() -> io::Result<()> { //println!("{}", x.deep_size_of()); - let (tx, rx) = connect("127.0.0.1:30000").await?; + let (tx, mut rx) = connect("127.0.0.1:30000").await?; let mut mtpkt = vec![]; mtpkt.write_u16::(2)?; // high level type diff --git a/src/recv_worker.rs b/src/recv_worker.rs index 60cadeb..5a156eb 100644 --- a/src/recv_worker.rs +++ b/src/recv_worker.rs @@ -34,7 +34,7 @@ pub struct RecvWorker { } impl RecvWorker { - pub async fn new(udp_rx: R, share: Arc>, pkt_tx: mpsc::UnboundedSender) { + pub fn new(udp_rx: R, share: Arc>, pkt_tx: mpsc::UnboundedSender) -> Self { Self { udp_rx, share, @@ -52,8 +52,6 @@ impl RecvWorker { .collect(), ), } - .run() - .await } pub async fn run(&self) { -- cgit v1.2.3