0

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

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

我的假设是我打算保持BufReader周围,以便它保持其内部状态。

我通过将引用传递给 the 来做到这一点TcpStreamBufReaderBufWriter我得到“借来的价值不会活得足够长”。我的问题是;我在哪里“存储”TcpStream它以使其寿命足够长?

我尝试了不同的迭代尝试将其存储streamConnection结构上,但我似乎无法让它工作。

这是代码的精简版本:

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();
}

如果我取消注释注释掉的行,它就可以工作。

4

0 回答 0