可以使用osnet模块来获取所有局域网IP。

const os = require('os');
const net = require('net');

function getAllIPs() {
  const interfaces = os.networkInterfaces();
  const ips = [];
  Object.keys(interfaces).forEach((name) => {
    interfaces[name].forEach((iface) => {
      if (iface.family === 'IPv4' && !iface.internal) {
        ips.push(iface.address);
      }
    });
  });
  return ips;
}

function getLocalIPs() {
  const ips = getAllIPs();
  const localIPs = [];
  ips.forEach((ip) => {
    const parts = ip.split('.');
    if (parts[0] === '10' || (parts[0] === '192' && parts[1] === '168') || (parts[0] === '172' && parts[1] >= 16 && parts[1] <= 31)) {
      localIPs.push(ip);
    }
  });
  return localIPs;
}

function testPort(ip, port, timeout = 200) {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      reject(new Error(`Timeout (${timeout}ms) trying to connect to ${ip}:${port}`));
      socket.destroy();
    }, timeout);
    const socket = new net.Socket();
    socket.connect(port, ip, () => {
      clearTimeout(timer);
      socket.end();
      resolve(ip);
    });
    socket.on('error', (err) => {
      clearTimeout(timer);
      reject(err);
    });
  });
}

async function getAllLocalIPsConnectedToPort(port, timeout = 200) {
  const localIPs = getLocalIPs();
  const promises = localIPs.map((ip) => testPort(ip, port, timeout));
  return Promise.allSettled(promises).then((results) => {
    return results.filter((result) => result.status === 'fulfilled').map((result) => result.value);
  });
}

// 例子:获取所有连接到80端口的局域网IP
getAllLocalIPsConnectedToPort(80).then((ips) => {
  console.log('Local IPs connected to port 80:', ips);
}).catch((err) => {
  console.error(err);
});

代码中,getAllIPs()函数获取所有IP地址,getLocalIPs()函数获取所有局域网IP地址,testPort()函数测试IP地址和端口是否可连接,getAllLocalIPsConnectedToPort()函数获取所有连接到指定端口的局域网IP地址

nodejs 获取所有局域网IP

原文地址: https://www.cveoy.top/t/topic/cFFV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录