gpt4 book ai didi

rust - 如何在block_on节中交换数据?

转载 作者:行者123 更新时间:2023-12-03 11:36:42 25 4
gpt4 key购买 nike

我正在学习Rust和Tokio,我怀疑我可能走错了方向。
我正在尝试打开与远程服务器的连接并执行握手。我想使用非阻塞IO,所以我在使用Tokio的线程池。需要快速执行握手,否则 Remote 将关闭套接字,因此我试图在单个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()的调用再也不会返回。
处理此问题的最佳方法是什么?

最佳答案

根据您的评论:

Nope, the connection is meant to remain open.


如果您从打开的连接中读取数据,则读取将一直阻塞,直到有足够的字节满足它为止,或者另一端关闭该连接为止,类似于阻塞读取在C语言中的工作方式。Tokio正按预期工作。
如果关闭流不表示消息已结束,那么您将必须做自己的工作来确定何时停止阅读并开始处理。一种简单的方法是只给请求加上一个长度前缀,并且只读取那么多字节。
请注意,无论您使用哪种API,都必须执行上述操作。是否使用Tokio的事实并不能真正回答“消息何时结束”这一根本问题。

关于rust - 如何在block_on节中交换数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64535642/

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