gpt4 book ai didi

asynchronous - 如何借用/避免在 tokio::spawn(async

转载 作者:行者123 更新时间:2023-11-29 08:31:07 25 4
gpt4 key购买 nike

我正在尝试用 Rust 编写一个 udp 客户端,它建立到远程服务器的套接字连接,应该监听传入的消息(然后处理数据),同时也能够发送消息然后在给定时间后断开连接.我想在 tokio 中使用新的 async/await 语法并生成一个任务来负责读取传入/处理传入消息,同时将套接字保留在主任务中以并行发送消息,尤其是在协议(protocol)结束时关闭连接。如何避免将套接字 move 到生成的任务中?有没有办法通过引用在该任务中借用它。我查看了类似问题的答案,但无法理解它,因为它们适用于没有新语法的 tokio 版本,而且我是 rust 的绝对初学者。

我可以将 socket move 到 spawned 函数中,但是它当然不再可供外部代码使用,需要并行发送消息。

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let remote_addr: SocketAddr = "...:xxxx".parse()?;

let local_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0,0,0,0)), 0);
let mut socket = UdpSocket::bind(&local_addr)?;
socket.connect(&remote_addr)?;
// do some protocol work with the socket to establish a connection
tokio::spawn(async move {
let mut buf = [0; 1024];

loop {
let l = match socket.recv(&mut buf).await {
// socket closed
Ok(l) if l == 0 => {
println!("socket closed");
return;
},
Ok(l) => l,
Err(e) => {
println!("failed to read from socket; err = {:?}", e);
return;
}
};
let data = buf[..l].to_vec();
println!("Received {} bytes:\n{:#x?}", l, data);
}
});

// here I would like to use the socket again to send messages and to do the disconnect protocol, i.e.
let len = socket.recv(.....

当我之后使用套接字时,我得到一个错误,变量由于在生成器中使用而 move ,并在生成任务结束时被丢弃(它不应该)。后面用socket说move后借用value,明明可以,但是怎么避免呢?如果有人可以帮助我解决这个初学者问题,我将不胜感激,尤其是在 tokio 的新异步/等待语法的上下文中。谢谢!

最佳答案

好吧,我用不同的方式解决了这个问题。 Tokio 的 UdpSocket 可以分为接收和发送部分。我在单独的任务中运行它们,然后使用多个 tokio::mpsc::channel 在两个任务和主任务之间进行通信。

关于asynchronous - 如何借用/避免在 tokio::spawn(async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57636240/

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