如何在block_on节中交换数据



我正在学习Rust和Tokio,我怀疑我可能走错了方向。

我正在尝试打开与远程服务器的连接并执行握手。我想使用非阻塞IO,所以我使用Tokio的线程池。握手需要快速执行,否则远程会关闭套接字,所以我试图将消息交换链接到一个单独的block_on部分:

let result: Result<(), Box<dyn std::error::Error>> = session
.runtime()
.borrow_mut()
.block_on(async {
let startup = startup(session.configuration());
stream.write_all(startup.as_ref()).await?;
let mut buffer:Vec<u8> = Vec::new();
let mut tmp = [0u8; 1];
loop {
let total = stream.read(&mut tmp).await;
/*
if total == 0 {
break;
}
*/
if total.is_err() {
break;
}
buffer.extend(&tmp);
}
Ok(())
});

我的问题是当套接字中没有更多字节可读取时该怎么办。我当前的实现读取响应,并且在最后一个字节挂起之后,我相信这是因为套接字没有关闭。我认为检查0字节的读取就足够了,但对read((的调用永远不会返回。

处理这个问题的最佳方法是什么?

来自您的评论:

不,连接是要保持打开的。

如果从打开的连接读取,读取将被阻塞,直到有足够的字节满足它,或者另一端关闭连接,类似于阻塞读取在C.Tokio中的工作方式。

如果关闭流并不是消息结束的信号,那么您将不得不自己做工作来确定何时停止读取并开始处理。一种简单的方法是在请求前面加一个长度,只读取那么多字节。

请注意,无论您使用什么API,都必须执行上述操作。事实上,你是否使用tokio并不能真正回答";消息何时结束";。

最新更新