簡體   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