gpt4 book ai didi

asynchronous - Rust异步不对套接字并行执行

转载 作者:行者123 更新时间:2023-12-03 11:41:14 25 4
gpt4 key购买 nike

我正在尝试使用Rust同时发送和接收到多播IP。

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();
}
}
这样做的问题是,它首先运行接收功能,然后运行发送功能,从不同时发送和接收。使用Golang,我可以使用Goroutines来做到这一点,但是我发现Rust很难做到这一点。

最佳答案

我对Rust中的async不太了解,但是您的first()second()函数似乎没有任何异步调用-换句话说,没有任何使用.await的调用。我的理解是,如果什么都没有等待,那么这些函数将同步运行,并且我相信您也会收到关于它的编译器警告。
看起来std::net::UdpSocket似乎没有提供可以等待的任何异步方法,而您需要使用async_std::net::UdpSocket代替。

关于asynchronous - Rust异步不对套接字并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62625546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com