我试图用Rust编写一个发现函数来发现局域网中的设备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令牌来验证响应,我们如何做到这一点?
发布于 2022-10-14 23:47:35
这在futures
-crate和select_ok()
中是可以实现的。
您可以执行以下操作:
Iterator
中的范围转换为Iterator
,并将每个元素i
映射为reqwest请求。select_ok
需要Vec
中的期货来实现UnPin
;这就是我在这里使用.boxed()
的原因。select_ok
Vec
response
将包含第一个成功的未来结果remaining_futures
用drop
取消其余的请求(我不确定这是否有效,您需要测试这个)use futures::{future::select_ok, FutureExt};
async fn discover() {
let futures = (0..256)
.into_iter()
.map(|i| {
let url = format!("http://192.168.0.{i}:8000/ping");
return reqwest::get(url).boxed();
})
.collect::<Vec<_>>();
let (response, mut remaining_futures) = select_ok(futures).await.unwrap();
remaining_futures.iter_mut().for_each(|f| drop(f));
}
https://stackoverflow.com/questions/74075082
复制相似问题