nodejs 获取所有局域网IP
可以使用os和net模块来获取所有局域网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地址
原文地址: https://www.cveoy.top/t/topic/cFFV 著作权归作者所有。请勿转载和采集!