TheAnonymous
TheAnonymous

Reputation: 51

Rust Async doesn't execute in parallel for sockets

I'm trying to send and receive simultaneously to a multicast IP with Rust.

use futures::executor::block_on;
use async_std::task;
use std::{net::{UdpSocket, Ipv4Addr}, time::{Duration, Instant}};

fn main() {
    let future = async_main();
    block_on(future);
}

async fn async_main() {
    let mut socket = UdpSocket::bind("0.0.0.0:8888").unwrap();
    let multi_addr = Ipv4Addr::new(234, 2, 2, 2);
    let inter = Ipv4Addr::new(0,0,0,0);
    socket.join_multicast_v4(&multi_addr,&inter);
    let async_one = first(&socket);
    let async_two = second(&socket);
    futures::join!(async_one, async_two);
}

async fn first(socket: &std::net::UdpSocket) {
    let mut buf = [0u8; 65535];
    let now = Instant::now();
    loop {
        if now.elapsed().as_secs() > 10 { break; }
        let (amt, src) = socket.recv_from(&mut buf).unwrap();
        println!("received {} bytes from {:?}", amt, src);
    }
}

async fn second(socket: &std::net::UdpSocket) {
    let now = Instant::now();
    loop { 
        if now.elapsed().as_secs() > 10 { break; }
        socket.send_to(String::from("h").as_bytes(), "234.2.2.2:8888").unwrap();
    }
}

The issue with this is first it runs the receive function and then it runs the send function, it never sends and receives simultaneously. With Golang I can do this with Goroutines but I'm finding this quite difficult in Rust.

Upvotes: 0

Views: 416

Answers (1)

Herohtar
Herohtar

Reputation: 5613

I'm not very experienced with async in Rust, but your first() and second() functions don't appear to have any asynchronous calls in them -- in other words, there are not any calls that use .await. My understanding is that if nothing is awaited, then the functions will run synchronously, and I believe you get a compiler warning about it as well.

It doesn't look like std::net::UdpSocket provides any async methods that can be awaited, and you need to use async_std::net::UdpSocket instead.

Upvotes: 4

Related Questions