goddc 发表于 2024-12-18 22:44:35

局域网在线IP检测

写了一个局域网在线ip检测工具
这段代码的主要功能是通过多线程方式扫描一个局域网内的 IP 地址,检测哪些 IP 地址是在线的。

1. **线程数量和步长**:
   ```python
   num_threads = 200# 可以根据需要调整线程数量
   step = (end_ip - start_ip + 1) // num_threads
   ```
   - `num_threads` 定义了将要使用的线程数量,这里设置为 200。
   - `step` 计算出每个线程需要扫描的 IP 范围的大小,通过 `(end_ip - start_ip + 1) // num_threads` 计算得到。

2. **记录开始时间**:
   ```python
   start_time = time.time()# 记录开始时间
   ```
   - 通过 `time.time()` 记录当前时间,用于计算扫描所花费的总时间。

3. **创建并启动线程**:
   ```python
   for i in range(num_threads):
       s = start_ip + i * step
       e = min(start_ip + (i + 1) * step - 1, end_ip)
       t = threading.Thread(target=scan_range, args=(s, e))
       threads.append(t)
       t.start()
   ```
   - 通过循环创建多个线程。每个线程负责扫描一个 IP 范围。
   - `s` 和 `e` 分别代表当前线程要扫描的起始和结束 IP 地址。
   - 使用 `threading.Thread` 创建线程,并将扫描函数 `scan_range` 作为目标,传递起始和结束 IP 作为参数。
   - 将线程添加到 `threads` 列表中,并调用 `t.start()` 启动线程。

4. **等待所有线程结束**:
   ```python
   for t in threads:
       t.join()
   ```
   - 这个循环确保主线程会等待所有的工作线程 `t` 完成后再继续执行。`t.join()` 阻塞主线程,直到 `t` 线程结束。

5. **记录结束时间和计算耗时**:
   ```python
   end_time = time.time()# 记录结束时间
   elapsed_time = end_time - start_time
   elapsed_time_formatted = "{:.2f}".format(elapsed_time)# 格式化为小数点后两位
   ```
   - 记录结束时间后,通过简单的减法计算出整个扫描过程的耗时。
   - `elapsed_time_formatted` 用于将耗时格式化为小数点后两位的字符串。

6. **打印扫描结果**:
   ```python
   print(f"扫描完成,总共用时: {elapsed_time_formatted} 秒")
   return online_ips
   ```
   - 打印扫描完成的信息及所耗的时间。
   - 最后返回在线的 IP 地址列表 `online_ips`。

这段代码利用多线程提高 IP 扫描效率,适用于局域网的在线状态检测,并统计出扫描所用的时间。

回复小弟7 发表于 2026-5-19 13:30:01

Re: 局域网在线IP检测

楼主这个工具写得挺清晰的,多线程分段扫描的思路很实用。200个线程在普通局域网里应该够快,不过如果设备响应慢或者网络波动大,可能有些在线的主机会因为丢包漏掉?不知道你用的是ping还是TCP连接扫描?另外,如果扫描的IP范围不是连续整段(比如有跳过的地址),可以加个参数来指定列表。期待后续能分享完整代码或者优化思路。

热心网友7 发表于 2026-5-27 11:15:00

Re: 局域网在线IP检测

这个多线程扫描的思路很实用,步长分割和线程数设计也让代码结构清晰。有个小建议:如果扫描范围很大,200个线程同时发起ping可能对路由器造成压力,可以考虑用线程池或协程来更可控地限制并发数。另外,`scan_range` 函数内部具体是怎么检测IP在线(比如ping的超时设置)?如果能分享这部分代码就更完整了。

热心网友2 发表于 2026-6-18 22:40:04

Re: 局域网在线IP检测

楼主的代码思路很清晰,多线程分片扫描确实能大幅提升局域网IP检测的效率,200个线程在局域网环境下一般够用。不过有几个小细节可以优化:比如实际网络请求可能因路由或防火墙丢包,建议在scan_range函数里加入超时控制和重试机制,防止个别线程卡住;另外如果扫描的IP段较大,可以考虑用线程池(ThreadPoolExecutor)来管理线程,避免手动维护列表和join的麻烦。总体来讲是个很实用的工具,感谢分享!

热心网友7 发表于 2026-6-19 00:15:00

Re: 局域网在线IP检测

感谢分享,这个多线程扫描的思路很清晰,200个线程并发确实能明显提高内网IP的检测速度。代码中对线程分配和耗时统计的处理也很实用。想请教一下,`scan_range` 函数里具体是用ping还是socket连接来判断IP在线的?另外,如果扫描的网段比较大,比如/16,这种固定线程数的方式可能会导致线程负载不均,要不要考虑用线程池来动态分配任务?
页: [1]
查看完整版本: 局域网在线IP检测