首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >发送并行请求并返回生锈的前200响应。

发送并行请求并返回生锈的前200响应。
EN

Stack Overflow用户
提问于 2022-10-14 21:38:38
回答 1查看 71关注 0票数 1

我试图用Rust编写一个发现函数来发现局域网中的设备IP,这个函数应该向IP空间中所有可能的IP发送HTTP请求,一旦接收到200种状态,返回值并取消所有其他请求(如果使用reqwest,则放弃未来)

代码语言:javascript
代码运行次数:0
运行
复制
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令牌来验证响应,我们如何做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-14 23:47:35

这在futures-crate和select_ok()中是可以实现的。

您可以执行以下操作:

  • Iterator中的范围转换为Iterator,并将每个元素i映射为reqwest请求。select_ok需要Vec中的期货来实现UnPin;这就是我在这里使用.boxed()的原因。

select_ok

  • 通过期货的Vec

  • response将包含第一个成功的未来结果

  • 我们可以使用remaining_futuresdrop取消其余的请求(我不确定这是否有效,您需要测试这个)

代码语言:javascript
代码运行次数:0
运行
复制
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));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74075082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档