如何将TcpStream提供给BufReader,然后将其取回?

时间:2016-08-21 18:59:21

标签: memory-management reference rust borrowing

我有一个结构:

pub struct Paradise {
    cstream: TcpStream,
}

用方法:

pub fn write_message(&mut self, code: i32, message: &str) {
    let foo = format!("{} {}\r\n", code, message);
    let _ = self.cstream.write(foo.as_bytes());
}

这很有效。它是一个FTP服务器,所以当我从TcpStream获得新的TcpListener::bind时,我会这样做:

let mut p = Paradise::new(stream);
p.start();

start方法中,我称之为:

self.write_message(220, "Welcome to Paradise");

果然,我在FTP客户端看到了这条消息。到目前为止一切都很好。

但接下来我做了:

let mut br = BufReader::new(&self.cstream);
loop {
    let mut buffer = String::new();
    let _ = br.read_line(&mut buffer);
    println!("{:?}", buffer);
    self.write_message(550, "Testing");
}

当我进入循环中的下一个write_message调用时:

  

无法借用*self作为可变对象,因为self.cstream也是如此   借用不可变[E0502]

完整代码:

https://github.com/andrewarrow/tinted_paradise/blob/169cc5f7025c417814f47a1fb3e3fc78ce4f9516/src/paradise.rs

https://github.com/andrewarrow/tinted_paradise/blob/169cc5f7025c417814f47a1fb3e3fc78ce4f9516/src/starter.rs

如何更改内容以便我可以在循环中调用write_message

1 个答案:

答案 0 :(得分:3)

  

如何将TcpStream提供给BufReader,然后将其取回?

致电BufReader::into_inner

impl<R: Read> BufReader<R> {
    fn into_inner(self) -> R
}
     

展开此BufReader,返回基础读者。

     

请注意,内部缓冲区中的任何剩余数据都将丢失。