繁体   English   中英

Rust 局部变量的异步问题

[英]Rust async issues with local variables

我有这样的方法:

    pub async fn build_incoming_stream(&mut self) -> impl Stream<Item = Result<
        SslStream<<tokio::net::tcp::Incoming<'_> as TryStream>::Ok>,
        Box<dyn Error + Send + Sync + 'static>,>,> 
    {
        let addr = self.address.parse::<SocketAddr>()
        .expect("Couldn't parse socket address");

        let mut listener = TcpListener::bind(addr)
                           .await
                           .expect("Couldn't bind address");
        let acceptor = self.configure_acceptor()
                       .await
                       .expect("configuring acceptor failed");

        incoming(listener.incoming(), acceptor.clone()) 
}

其中 fn 传入是:

    pub fn incoming<S>(incoming: S,acceptor: SslAcceptor,) -> impl Stream<Item =  
    Result<SslStream<S::Ok>, StreamError>> where
     S: TryStream + Unpin,
     S::Ok: AsyncRead + AsyncWrite + Send + Sync + Debug + Unpin + 'static,
     S::Error: Into<StreamError>,
    {
      let mut incoming = incoming;

      try_stream! {
         while let Some(stream) = incoming.try_next().await? {
            let tls = tokio_openssl::accept(&acceptor, stream).await?;

            let ssl = SslStream {
               inner: tls
            };

             yield ssl;
         }
       }
     }

编译器一直抱怨我无法在 build_incomig_stream fn 的最后一行返回引用本地数据的值:

无法返回引用本地数据listener器的值返回引用当前 function 拥有的数据的值

我试图将它包装在异步移动块中以捕获侦听器,但没有运气......任何想法我该如何解决或解决这个问题?

似乎 tcp 监听器已经实现了 stream,所以这段代码有效:

pub async fn build_incoming_stream(
        &mut self,
    ) -> impl Stream<
        Item = Result<
            SslStream<<tokio::net::tcp::Incoming<'_> as TryStream>::Ok>,
            Box<dyn Error + Send + Sync + 'static>,
        >,
    > {
        let addr = self
            .address
            .parse::<SocketAddr>()
            .expect("Couldn't parse socket address");

        
        let acceptor = self
            .configure_acceptor()
            .await
            .expect("configuring acceptor failed");
       

        incoming(
            TcpListener::bind(addr)
                .await
                .expect("Couldn't bind address"),
            acceptor.clone(),
        )
    }

相关代码的问题在于

pub fn incoming(&mut self) -> Incoming<'_> {
        Incoming::new(self)
    }

因为传入将 tcp 侦听器作为可变引用,这造成了麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM