最快方式是用child_process调用系统ping,需按平台设超时(Linux/macOS用-W 1、Windows用-w 1000),并发控制16–32个进程,避免阻塞;is-online等库仅检测公网连通性,不适用于局域网设备探测。

直接用 child_process 调用系统 ping 最快,但别信单次结果
Node.js 原生没提供跨平台的“批量 ping 扫描”能力,dns.lookup 或 net.connect 都不能替代 ICMP 探测。最直接有效的方式仍是调用系统 ping,但要注意:Linux/macOS 用 ping -c 1 -W 1,Windows 用 ping -n 1 -w 1000——超时值必须显式设小,否则默认等 4 秒,扫一个 C 段(254 个 IP)要近 17 分钟。
常见错误是写成 ping -c 1 ip 后不检查 stderr 就判断失败;实际 Windows 下成功时 stderr 也可能非空,得靠 error === null + stdout.includes('bytes=') 双保险。
- 别用
execSync扫全量:阻塞主线程,VSCode 可能卡死或被系统 kill - 并发控制必须做:一次发 16–32 个子进程足够,再多容易触发系统 socket 耗尽或 ICMP 限速
- 局域网内建议优先扫
192.168.1.1–192.168.1.254这类常见段,避免扫0和255广播地址(多数设备会响应但无意义)
is-online 和 internet-available 不适合局域网扫描
这两个库只检测“能否连通公网 DNS”,原理是向 8.8.8.8:53 或自定义 DNS 发 UDP 查询包。它们对局域网 IP 完全无效——你 ping 不通隔壁工位电脑,但 is-online() 仍可能返回 true,因为你的路由器还在转发 DNS 请求。
如果你误把它们当网络发现工具,会出现“明明电脑就插着网线,脚本却说离线”的困惑。它们的用途仅限于启动时快速判断是否该走本地 mock 数据,而非探测物理设备存活。
-
is-online在浏览器里甚至只读navigator.onLine,这个 API 在 Chrome/Firefox 中已明确说明:断网时可能返回true,连网时也可能返回false -
internet-available的retries参数是重试 DNS 查询次数,不是对同一个 IP 多次 ping - 想确认某台局域网设备是否开机且网卡在线,唯一可靠路径仍是 ICMP 或 TCP 端口探测(如
net.createConnection({ port: 22, host: '192.168.1.100' }))
在 VSCode 终端里跑扫描脚本,PID 和日志必须自己管
VSCode 不会帮你记录你启动的扫描进程 PID,也不会聚合多个 ping 子进程的输出。如果你在集成终端里执行 node scan.js,然后切到别的标签页,扫描中途报错或卡住,你根本看不到错误堆栈——除非脚本自己把 console.error 重定向到文件。
更关键的是:扫完后你想知道哪些 IP 活着,不能只靠 console.log 往终端刷几百行。应该写入 JSON 文件,再用 VSCode 自带的 JSON 查看器打开,或者配合 grep 快速过滤:
node scan.js > results.json 2>&1 cat results.json | jq '.alive[] | select(.rtt < 50)'
- 别依赖 VSCode 的“运行和调试”面板来执行扫描:它专为单入口、有明确生命周期的程序设计,不适合长时异步任务
- 终端里用
Ctrl+C中断扫描时,部分未完成的ping子进程可能残留,用ps aux | grep ping清理 - 如果扫描目标含 Windows 主机,注意它们默认禁 ping;需提前在防火墙中启用“文件和打印机共享(回显请求 - ICMPv4-In)”规则
真要实时监控,别做轮询,改用 arp-scan 或 nmap
纯 Node.js 实现的持续轮询(比如每 5 秒扫一遍)效率低、干扰大,且无法感知 ARP 表变化。Linux/macOS 下直接用 arp-scan --local,Windows 下用 nmap -sn 192.168.1.0/24,速度提升 5–10 倍,且结果包含 MAC 地址和厂商信息,比 ping 更具诊断价值。
VSCode 里调用它们只需一行:exec('arp-scan --local', ...) 或 exec('nmap -sn 192.168.1.0/24', ...)。注意 nmap 在 macOS 上需 brew install nmap,Windows 需加装 WinPcap/Npcap 驱动。
-
arp-scan结果里Interface字段告诉你用了哪个网卡,避免扫错 VLAN -
nmap -sn的--min-rate 1000可提速,但可能被交换机限速,局域网内建议保持默认 - 不要在 launch.json 里配置自动执行这类扫描:调试器附加后,进程生命周期由 VSCode 控制,容易导致扫描中断或权限不足
真实局域网扫描最常被忽略的点是:你以为在扫 IP,其实是在扫“当前路由表指向的子网”。如果机器配了多网卡(比如 WiFi + 有线),os.networkInterfaces() 返回的地址可能有多个,但 192.168.1.0/24 和 10.0.2.0/24 是完全不同的广播域——扫错段,结果永远为空。


















