在哪里存储TcpStream与BufReader和BufWriter共享

时间:2019-04-22 05:15:53

标签: rust borrow-checker lifetime-scoping

我正在尝试为具有自己的简单TCP协议的程序构建一个简单的客户端程序包。

大多数通信是通过发送命令并立即读取单个线路响应来进行的。一些命令需要读取多个响应。我一直在使用BufReader::read_line()来读取单行,但是当它读得太多时,它似乎会下降,第二个read_line()可能会丢失该行的开头。

我的假设是,我打算将BufReader保留在其内部,以保持其内部状态。

我这样做是通过将TcpStream的引用传递给BufReaderBufWriter来实现的,但是我得到的是“借来的价值寿命不长”。我的问题是;我应该在哪里“存储” TcpStream,使其寿命足够长?

我尝试过将stream存储在Connection结构上的不同迭代,但是我似乎无法使其正常工作。

这是该代码的简化版本:

use std::io::{self, BufReader, BufWriter};
use std::net::TcpStream;

#[derive(Debug)]
pub struct Connection<'a> {
    reader: BufReader<&'a TcpStream>,
    writer: BufWriter<&'a TcpStream>,
}

impl<'a> Connection<'a> {
    pub fn new(stream: TcpStream) -> io::Result<Self> {
        let connection = Self {
            reader: BufReader::new(&stream),
            writer: BufWriter::new(&stream),
        };

        Ok(connection)
    }
}

pub struct Search<'a> {
    connection: Connection<'a>,
}

impl<'a> Search<'a> {
    // fn new(stream: &'a TcpStream) -> Self {
    fn new() -> Self {
        let stream = TcpStream::connect("127.0.0.1:100").unwrap();
        let connection = Connection::new(stream).unwrap();

        Self { connection }
    }
}

fn main() {
    // let stream = TcpStream::connect("127.0.0.1:100").unwrap();
    // Search::new(&stream);

    Search::new();
}

如果我取消注释掉注释行,它将起作用。

0 个答案:

没有答案