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

如何在Node.js中获取设备当前活跃的本地IPv4地址?

在Node.js中准确获取当前活跃的本地IPv4地址

方法一:基于系统网络接口的精准过滤(适合已知目标网段)

如果你的路由器固定分配10.x.x.x段的IP,可以直接遍历系统接口,筛选出符合条件的活跃IPv4:

const os = require('os');

function getActiveLocalIP(targetSubnet = '10.') {
  const interfaces = os.networkInterfaces();
  for (const ifaceName of Object.keys(interfaces)) {
    const addresses = interfaces[ifaceName];
    for (const addr of addresses) {
      // 过滤IPv4、非回环地址、匹配目标网段
      if (addr.family === 'IPv4' && !addr.internal && addr.address.startsWith(targetSubnet)) {
        return addr.address;
      }
    }
  }
  // 兜底方案:回退到ip模块的默认方法
  return require('ip').address();
}

// 使用示例
console.log(getActiveLocalIP()); // 输出当前活跃的10.x.x.x段IP

代码说明

  • os.networkInterfaces():获取设备所有网络接口的详细配置
  • 核心过滤逻辑:
    • 仅保留IPv4类型地址
    • 排除回环地址(如127.0.0.1)
    • 精准匹配路由器分配的网段(此处为10.开头)
  • 未找到匹配IP时,用ip模块的默认方法作为兜底

方法二:基于UDP套接字的通用方法(自动识别当前路由IP)

如果需要适配任意网络环境,无需提前知道网段,可以通过临时UDP套接字获取系统当前对外通信的活跃IP:

function getCurrentActiveIP() {
  return new Promise((resolve, reject) => {
    const dgram = require('dgram');
    const socket = dgram.createSocket('udp4');
    
    socket.on('error', (err) => {
      socket.close();
      reject(err);
    });
    
    // 连接到外部公网IP(无需实际发送数据)
    socket.connect(80, '8.8.8.8', () => {
      const address = socket.address();
      socket.close();
      resolve(address.address);
    });
  });
}

// 使用示例
getCurrentActiveIP().then(ip => {
  console.log('当前活跃IP:', ip);
}).catch(err => {
  console.error('获取IP失败:', err);
});

代码说明

  • 创建UDP套接字并连接到公网地址(此处用谷歌DNS的8.8.8.8),无需实际传输数据
  • socket.address()返回的本地IP,就是系统当前路由优先使用的活跃IP
  • 该方法不依赖接口名称或网段,自动适配WiFi、以太网等不同连接方式

针对你的场景的优化建议

由于你的设备仅能识别10.x.x.x段IP,推荐优先使用方法一,直接锁定目标网段,避免误选闲置适配器的IP。如果需要适配更多网络环境,可以结合方法二做兜底逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:43:15