gpt4 book ai didi

tcp - TcpStream 上的 BufReader::lines() 停止迭代

转载 作者:可可西里 更新时间:2023-11-01 02:33:05 25 4
gpt4 key购买 nike

我有一个相当简单的代码,它使用 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!();
}
}

最佳答案

令人惊讶的是,我猜这是客户端的“默认超时”(套接字正在进入 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 数据包,下一次迭代完全按预期工作。

关于tcp - TcpStream 上的 BufReader::lines() 停止迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32423804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com