【问题标题】:BufReader::lines() over TcpStream stops iterationTcpStream 上的 BufReader::lines() 停止迭代
【发布时间】:2015-09-06 12:55:24
【问题描述】:

我有一个相当简单的代码,在它周围使用TcpStreamSslStream,用BufReader 逐行读取套接字。有时迭代器只是停止返回任何带有Ok(0)的数据:

let mut stream = TcpStream::connect((self.config.host.as_ref(), self.config.port)).unwrap();
if self.config.ssl {
    let context = ssl::SslContext::new(ssl::SslMethod::Tlsv1_2).unwrap();
    let mut stream = ssl::SslStream::connect(&context, stream).unwrap();
    self.stream = Some(ssl::MaybeSslStream::Ssl(stream));
} else {
    self.stream = Some(ssl::MaybeSslStream::Normal(stream));
}

...

let read_stream = clone_stream(&self.stream);

let line_reader = BufReader::new(read_stream);

for line in line_reader.lines() {
    match line {
        Ok(line) => {
            ...
        }
        Err(e) => panic!("line read failed: {}", e),
    }
}
println!("lines out, {:?}", self.stream);

据我所知,循环只是随机停止,没有理由相信套接字在服务器端关闭。循环结束后调用self.stream.as_mut().unwrap().read_to_end(&mut buf) 返回Ok(0)

关于如何处理这方面的任何建议?我没有得到任何Err,所以我可以假设套接字还活着,但我无法从中读取任何内容。套接字的当前状态是什么,我应该如何处理?

PS:根据评论者的建议,我提供clone_stream 的实现作为参考。

fn clone_stream(stream: &Option<ssl::MaybeSslStream<TcpStream>>) -> ssl::MaybeSslStream<TcpStream> {
    if let &Some(ref s) = stream {
        match s {
            &ssl::MaybeSslStream::Ssl(ref s) => ssl::MaybeSslStream::Ssl(s.try_clone().unwrap()),
            &ssl::MaybeSslStream::Normal(ref s) => ssl::MaybeSslStream::Normal(s.try_clone().unwrap()),
        }
    } else {
        panic!();
    }
}

【问题讨论】:

  • 没有理由相信套接字在服务器端关闭了——你能以一种方式或另一种方式证明这一点吗?在关闭的套接字上读取零字节是一种正常情况,听起来就像你所拥有的那样。
  • 请尽量减少您的测试用例并生成MCVE。事实上,我们不知道clone_stream 做了什么。此外,这可能只是 SSL 包装器中的一个错误,因此请尝试删除条件并将其固定到一个或另一个。

标签: tcp rust


【解决方案1】:

令人惊讶的是,我猜这是客户端上的“默认超时”(套接字正在进入CLOSE_WAIT 状态)。

我通过首先添加来修复它:

stream.set_read_timeout(Some(Duration::new(60*5, 0)));
stream.set_write_timeout(Some(Duration::new(60*5, 0)));

这使得迭代器在超时时失败,ErrorKind::WouldBlock,此时我添加了一个代码以通过线路发送一个 ping 数据包,下一次迭代完全按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2015-12-15
    • 2012-08-26
    • 1970-01-01
    • 2020-08-06
    • 2011-08-31
    • 2017-12-10
    相关资源
    最近更新 更多