You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向IP地址段发送请求异常:仅192.168.0.200接收请求技术咨询

解决IP段请求仅最后一个IP响应的问题

嘿,我太懂你这种疑惑了——明明写了循环要给整个IP段发请求,结果只有最后一个192.168.0.200有响应对吧?其实问题出在浏览器加载iframe的速度跟不上你的循环节奏:循环跑得太快,前面的IP请求刚要发起,就被下一次循环替换了iframe的src,最后只有最后一次请求真正完成了加载。

下面给你几个实用的解决方案,你可以根据自己的场景挑:

方案1:给每个请求加延迟(复用单个iframe)

通过setTimeout给每个请求设置间隔,让浏览器有足够时间加载完当前请求再发下一个。注意要把循环变量i作为参数传给定时器,避免闭包陷阱:

for(var i = 100; i <= 200; i++) {
  // 每个请求间隔500ms,可根据实际情况调整延迟时间
  setTimeout(function(ip) {
    var query = 'http://admin:admin@192.168.0.' + ip + '/cgi-bin/devVideoInput.cgi?action=autoFocus';
    $('#ifr').attr('src', query);
  }, 500 * (i - 100), i);
}

方案2:创建多个独立iframe(并行请求,无延迟)

不用复用单个iframe,而是给每个IP创建一个隐藏的独立iframe,这样每个请求都能独立加载,不会被覆盖:

for(var i = 100; i <= 200; i++) {
  var query = 'http://admin:admin@192.168.0.' + i + '/cgi-bin/devVideoInput.cgi?action=autoFocus';
  // 创建隐藏的iframe,加载对应IP的请求
  var iframe = $('<iframe>', {
    src: query,
    style: 'display: none; width: 0; height: 0;'
  });
  $('body').append(iframe);
}

这个方案的好处是请求可以并行发起,但要注意如果IP数量太多,可能会占用较多浏览器资源,不过200个以内基本没问题。

方案3:用Fetch API发送请求(更可控,推荐)

如果不需要依赖iframe,用Fetch(或者XMLHttpRequest)会更灵活,还能捕获请求成功/失败的状态,处理起来更清晰:

async function sendBatchRequests() {
  for(var i = 100; i <= 200; i++) {
    try {
      const ip = i;
      const url = `http://admin:admin@192.168.0.${ip}/cgi-bin/devVideoInput.cgi?action=autoFocus`;
      // 发送请求,带认证信息
      await fetch(url, {
        method: 'GET',
        credentials: 'include'
      });
      console.log(`✅ 192.168.0.${ip} 请求成功`);
      // 可选:加个小延迟,避免请求过于密集
      await new Promise(resolve => setTimeout(resolve, 300));
    } catch(error) {
      console.error(`❌ 192.168.0.${ip} 请求失败:`, error.message);
    }
  }
}

// 调用函数发起请求
sendBatchRequests();

这个方案的优势是可以明确知道每个请求的状态,而且不需要创建额外的DOM元素,代码更整洁。


内容的提问来源于stack exchange,提问作者Ivan Terzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:07:46