【问题标题】:How do I give a TcpStream to a BufReader but then take it back?如何将 TcpStream 提供给 BufReader,然后将其取回?
【发布时间】:2023-03-22 04:41:01
【问题描述】:

我有一个结构:

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 服务器,所以当我从 TcpListener::bind 获得新的 TcpStream 时,我会这样做:

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

【问题讨论】:

  • ^ 你是说我错误地使用堆栈溢出来学习 rust 吗?你为什么这么反对学习?
  • 哈哈,我当然不反对学习。我am(间接地)指出,很多人已经花费大量时间在大约 70 个上下文中向大约 70 人解释该错误消息。除了normal Rust documentation 之外,阅读(大部分)它们会很有礼貌,并解释是什么让你的问题与众不同。请注意,我回答了您在标题中提出的问题,这似乎是独一无二的,但实际上可能与 stackoverflow.com/q/35869078/155423 或从那里链接的那些重复。
  • 另外,我很确定“你为什么这么反对学习?”是某种逻辑谬误或类似的...... ^_^
  • @AndrewArrow:stackoverflow 的目的是在 不必问问题的情况下得到答案。它还旨在巩固知识,而不是将其分散在许多页面中的十几个半心半意的解释中。这意味着,一般来说,如果你问一个已经被问过的问题,它应该被关闭。如果已经提出的问题的答案不够充分,那么最好改进那些,而不是在那里留下不完整的答案。作为推论,不同的问题需要清楚地表明如何不同;这可能并不明显。

标签: memory-management reference rust borrowing


【解决方案1】:

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

致电BufReader::into_inner:

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

解开这个BufReader,返回底层阅读器。

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

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多