nodejs获取机器IP&扫描局域网
【代码】nodejs获取机器IP&扫描局域网。
·
nodejs获取机器IP&局域网扫描
步骤
- 获取本机的网卡IP
- 将所在IP转换成对应网段,对应子网只能是
255.255.255.0这种,- 注: 没有考虑比如
192.168.0.0/255.255.252.0类似的情况
- 注: 没有考虑比如
- 通过socket方式逐个链接,链接成功的保存下来,链接失败的返回false
- 最终结果返回一个扫描到的数组
代码
const os = require("os"); //导入OS模块
const net = require("net");
const Socket = net.Socket;
const timeout = 100;
/**
* 链接指定主机,成功则返回IP,失败返回false
* @param {string} host ip地址
* @param {number} port 端口号
* @param {function} cb 回调
* @returns Promise
*/
async function scanHost(host, port, cb) {
return new Promise((resolve, reject) => {
const socket = new Socket();
socket.setTimeout(timeout);
socket.on("connect", function () {
console.debug(`链接成功:${host}`);
socket.end();
cb && cb(null, host);
resolve(host);
});
socket.on("timeout", function () {
console.error(`链接超时:${host}`);
socket.destroy();
cb && cb(new Error("timeout"), host);
resolve(false);
});
socket.on("error", function (err) {
console.warn(`链接失败:${host}`);
cb && cb(err, host);
resolve(false);
});
socket.on("close", function (err) {});
socket.connect(port, host);
});
}
/**
* 扫描指定网段
* @param {string} net 网段
* @param {number} port 端口号
* @param {function} cb 回调
* @returns Pomise
*/
async function scan(net, port, cb) {
if (port < 0 || port > 65535) {
throw new Error("输入的端口号超过有效范围0 ~ 65535.");
}
const deferCache = [];
for (let i = 1; i <= 255; i++) {
deferCache.push(scanHost(net + "." + i, port));
}
const result = (await Promise.all(deferCache)).filter((it) => it);
if (cb) {
cb(result);
}
return result;
}
/**
* 获取本机局域网的IPV4
* @return {Array}
*/
function getIpAddress() {
let ipv4 = [];
let ifaces = os.networkInterfaces();
// console.log(ifaces); //所有类型的适配器和全部内容
for (let dev in ifaces) {
if (/en[\d]+/.test(dev)) {
ifaces[dev].forEach(function (details, alias) {
//判断需要获取IP的适配器,过滤掉非IPv4和mac无效的设备
if (details.family == "IPv4" && details.mac !== "00:00:00:00:00:00") {
//判断是IPV4还是IPV6 还可以通过alias去判断
ipv4.push(details.address);
}
});
}
}
return ipv4;
}
function getNet() {
const ipv4 = getIpAddress();
const netList = [];
console.debug(`找到有效IP: ${ipv4.join(", ")}`);
if (!ipv4 || !ipv4.length) {
return false;
}
ipv4.map((ip) => {
const net = ip.split(".").slice(0, 3).join(".");
if (!netList.includes(net)) {
netList.push(net);
}
});
return netList;
}
// console.log(getIpAddress());
// console.log(getNet());
// scan(getNet(), 22221, (result) => {
// console.log(result);
// });
async function autoScan(port = 22221) {
const netList = getNet();
if (!netList || !netList.length) {
return;
}
return (await Promise.all(netList.map(async (net)=>{
const result = await scan(net, port)
if(result && result.length){
return result
}
return false
}))).filter(it => it)
}
// scan("192.168.32", 22221, (result) => {
// console.log(result);
// });
// scan("192.168.32", 5555, (result) => {
// console.log(result);
// });
// test
autoScan(80).then((result) => console.log(result));
// module.exports = {
// autoScan,
// scan,
// getIpAddress,
// getNet,
// scanHost,
// };
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)