我尝试在Rust中编写一个发现函数,发现LAN中的设备IP,此函数应发送IP空间中所有可能IP的HTTP请求,一旦接收到200状态,则返回值并取消所有其他请求(通过丢弃将来使用的reqwest)
async fn discover() -> Result<String, ()> {
for i in 0..256 {
tokio::spawn(async move {
let url = format!("http://192.168.0.{i}:8000/ping");
reqwest::get(url).await;
});
}
}
编辑1
一旦接收到200状态,则返回该值并取消所有其他请求
我们还想验证响应内容,以确保这是正确的设备,而不是试图监视网络的人。我们将通过验证从/ping
端点返回的JWT标记来验证响应,我们如何才能做到这一点
1条答案
按热度按时间4zcjmb1e1#
这可以通过
futures
-crate和select_ok()
来实现。您可以执行以下操作:
Iterator
中的范围,并将每个元素i
Map到 reqwest 请求中。select_ok
需要Vec
中的Futures来实现UnPin
;这就是我在这里使用.boxed()
的原因。Vec
传递到select_ok
response
将包含第一个成功的未来结果remaining_futures
来取消drop
的剩余请求(我不确定这是否有效,您需要对此进行测试)