【问题标题】:How do I read_until the tokio::net::TcpStream in a future chain?我如何 read_until 未来链中的 tokio::net::TcpStream ?
【发布时间】:2018-11-19 07:38:52
【问题描述】:

我想从TcpStream 读取数据,直到遇到“\0”。 问题是tokio::io::read_until 需要流为BufRead

fn poll(&mut self) -> Poll<(), Self::Error> {
    match self.listener.poll_accept()? {
        Async::Ready((stream, _addr)) => {
            let task = tokio::io::read_until(stream, 0, vec![0u8; buffer])
                 .map_err(|_| ...)
                 .map(|_| ...);
            tokio::spawn(task);
        }
        Async::NotReady => return Ok(Async::NotReady),
    }
}

如何通过这种方式从TcpStream 读取数据?

【问题讨论】:

  • 请查看如何创建minimal reproducible example,然后查看edit 您的问题以包含它。我们无法分辨代码中存在哪些 crate、类型、特征、字段等。尝试在Rust Playground 上重现您的错误,或者您可以在全新的 Cargo 项目中重现它。还有Rust-specific MCVE tips
  • 请包含您收到的确切错误消息。
  • 我想我的问题对你来说很简单,所以没有必要提供这么多数据。今天有点赶时间,下次有时间。

标签: asynchronous tcp rust future rust-tokio


【解决方案1】:

阅读BufRead 的文档,您会看到以下文字:

如果你有实现Read的东西,你可以使用BufReader type把它变成BufRead

fn example(stream: TcpStream) {
    io::read_until(std::io::BufReader::new(stream), 0, vec![]);
}

【讨论】:

  • 谢谢,它有效。但是由于某种原因read_exact 将数据写入缓冲区的末尾。实际上,我最终实现了一个自定义的未来,它使用流并将流与读取的数据一起作为元组返回——就像write_all,但用于读取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
相关资源
最近更新 更多