node.js 的 net 模块无法发送 arp 请求,因其仅支持传输层;应调用系统命令如 arp-scan 或 nbtscan,并注意权限、路径及环境配置问题。

直接用 net 模块发 ARP 请求不现实
Node.js 原生 net 模块无法构造或发送二层 ARP 包,它只工作在传输层(TCP/UDP),而 ARP 是链路层协议。试图用 net.createConnection() 或 net.Socket 去“探测”局域网设备在线状态,本质是 TCP 连接尝试——这会漏掉大量不开放端口的设备(如打印机、IoT 设备、休眠主机),且容易被防火墙拦截或超时阻塞。
nbtscan 或 arp-scan 命令才是实用起点
真实有效的局域网设备发现,依赖操作系统原生的 ARP 表查询或主动扫描能力。VSCode 中可通过 Node 的 child_process.exec 调用这些命令行工具,比纯 JS 实现更可靠、兼容性更好:
-
arp-scan --local:Linux/macOS 下最轻量,直接读取本地 ARP 缓存并主动发探测包,返回 IP+MAC+厂商信息 -
nbtscan -r 192.168.1.0/24:Windows/Linux 均可用,专扫 NetBIOS 主机名和共享信息,对 WinNT/Win10 局域网设备识别率高 - 避免用
ping批量扫:ICMP 可能被禁用,且无 MAC 地址返回,无法区分设备类型
示例片段(Node 端调用):
const { exec } = require('child_process');
exec('arp-scan --local', (err, stdout) => {
if (err) return;
console.log(stdout.match(/([0-9]{1,3}\.){3}[0-9]{1,3}\s+([0-9a-fA-F:]{17})/g));
});
VSCode 启动脚本需显式声明权限与路径
在 VSCode 终端中运行上述命令失败,常见原因不是代码问题,而是环境缺失:
- macOS 上
arp-scan需sudo权限才能发原始包,直接exec会因权限拒绝退出 —— 应改用sudo arp-scan --local并提前配置免密(sudo visudo加入%yourgroup ALL=(ALL) NOPASSWD: /usr/local/bin/arp-scan) - Windows 用户若用
nbtscan.exe,必须确保该二进制文件在系统PATH中,或传绝对路径(如C:\tools\nbtscan.exe -r 192.168.1.0/24) - VSCode 默认终端可能未加载用户 shell 配置(如
~/.zshrc),导致which arp-scan找不到 —— 建议在 VSCode 设置中启用terminal.integrated.inheritEnv: true
别指望纯 JS 实现“零依赖嗅探”
有人尝试用 dgram 发 UDP 广播、用 dns.lookup 反查主机名,但这些方法要么需要目标设备主动响应(不可靠),要么仅返回 DNS 缓存(过期或为空)。真正的局域网设备在线判断,核心依赖的是操作系统内核维护的 ARP 表 —— 它是网络栈底层对“谁在我隔壁”的唯一权威记录。任何绕过 arp-scan/ip neigh/arp -a 的纯 JS 方案,本质上都在猜。











