Asynchronous 如何在tokio::spawn(异步)中借用/避免移动套接字

Asynchronous 如何在tokio::spawn(异步)中借用/避免移动套接字,asynchronous,rust,move,spawn,rust-tokio,Asynchronous,Rust,Move,Spawn,Rust Tokio,我正在尝试用rust编写一个udp客户机,它建立到远程服务器的套接字连接,应该侦听传入的消息(然后处理数据),同时也能够发送消息,并在给定时间后断开连接。我想在tokio中使用新的async/await语法,生成一个任务,负责读取传入/处理传入消息,同时将套接字保留在主任务中以并行发送消息,尤其是在协议结束时关闭连接离子。 我怎样才能避免将套接字移动到衍生任务中?有没有办法在该任务中借用它?也许可以通过引用。我查看了类似问题的答案,但无法理解,因为它们适用于没有新语法的tokio版本,而且我是铁

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

我可以将套接字移动到生成的函数中,但是它当然不再对外部代码可用,而外部代码需要并行发送消息

#[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(.....
#[tokio::main]
异步fn main()->结果{
让远程地址:SocketAddr=“…:xxxx”.parse()?;
让local_addr=SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0,0,0,0)),0);
让mut socket=UdpSocket::bind(&local_addr)?;
插座连接(和远程地址)?;
//对套接字执行一些协议工作以建立连接
东京:产卵(异步移动){
设mut buf=[0;1024];
环路{
让l=匹配socket.recv(&mut buf)。等待{
//插座闭合
如果l==0=>{
println!(“插座关闭”);
返回;
},
Ok(l)=>l,
错误(e)=>{
println!(“从套接字读取失败;错误={:?}”,e);
返回;
}
};
设data=buf[…l]。to_vec();
println!(“收到的{}字节:\n{:#x?}”,l,数据);
}
});
//在这里,我想再次使用套接字发送消息并执行断开连接协议,即。
设len=socket.recv(。。。。。
当我在之后使用套接字时,我得到一个错误,即变量由于在生成器中使用而移动,并在生成任务结束时被删除(它不应该这样做)。稍后使用套接字时,表示移动后借用的值,这很清楚,但我如何避免它?
如果有人能帮我解决这个初学者问题,我将不胜感激,特别是在tokio新的异步/等待语法的背景下。谢谢!

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

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