Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)

yizhihongxing

完成该任务需要涉及到以下几个步骤:

  1. 导入相关模块
  2. 获取本机IP地址及子网掩码
  3. 构建IP地址范围
  4. 扫描IP地址范围
  5. 发现Web服务器并输出地址

具体实现情况如下:

  1. 导入相关模块

在开始之前,需要导入以下几个Node.js核心模块:

const os = require('os');
const net = require('net');
const {worker, isMainThread, parentPort} = require('worker_threads');

其中,os模块用于获取本机IP地址和子网掩码,net模块用于建立TCP连接并扫描端口。而worker_threads模块则用于在多线程环境下处理大量扫描任务。

  1. 获取本机IP地址及子网掩码

为了将扫描限定在局域网范围内,需要先获取本机IP地址和子网掩码。这可以通过os模块提供的网络接口信息来实现:

let interfaces = os.networkInterfaces();
let localAddress, netmask;

Object.keys(interfaces).forEach(name => {
  interfaces[name].forEach(ip => {
    if (ip.family === 'IPv4' && !ip.internal) {
      localAddress = ip.address;
      netmask = ip.netmask;
    }
  });
});

在上述代码中,我们遍历了物理网络接口清单,并选取其中第一个IPv4地址作为本机IP地址。同时,也需要记录选中的网卡的子网掩码,在后续计算IP地址范围时使用。

  1. 构建IP地址范围

通过本机IP地址和子网掩码,可以计算出本机所在子网内的所有IP地址。为了便于扫描,需要将IP地址转换为十进制数字形式。这里我们使用一个ip2dec函数来实现这个转换功能:

function ip2dec(addr) {
  let parts = addr.split('.');
  let dec = 0;
  for (let i = 0; i < 4; i++) {
    dec += parseInt(parts[i]) << (8 * (3 - i));
  }
  return dec >>> 0;
}

有了这个函数之后,我们就可以构建IP地址范围了。假设本机IP地址为192.168.0.100,子网掩码为255.255.255.0,那么可以通过如下代码计算出IP范围:

let network = ip2dec(localAddress) & ip2dec(netmask);
let min = network + 1;
let max = network | (0xFFFFFFFF ^ ip2dec(netmask));

这里的network表示子网号,minmax分别表示子网内第一个和最后一个可用IP地址。

  1. 扫描IP地址范围

有了IP地址范围之后,就可以开始扫描指定范围内的IP地址。这里我们使用TCP连接来扫描每个IP地址上的80端口,如果连接成功,则表示该IP地址上有Web服务器。

为了加速扫描速度,我们可以借助worker_threads模块在多线程环境下同时执行多个扫描任务。具体实现如下:

async function scan(start, end, done) {
  if (isMainThread) {
    let workerCount = Math.min(end - start, os.cpus().length);
    let blockSize = Math.ceil((end - start) / workerCount);
    let workers = [];
    let result = [];

    for (let i = 0; i < workerCount; i++) {
      workers.push(new Promise((resolve, reject) => {
        let worker = new Worker(__filename, {workerData: {start: start + i * blockSize, end: Math.min(start + (i + 1) * blockSize, end)}});
        worker.on('error', reject);
        worker.on('message', message => resolve(message));
        worker.on('exit', code => {
          if (code !== 0) reject(new Error(`Worker exited with code ${code}`));
        });
      }));
    }

    Promise.all(workers).then(result => {
      done(result.flat());
    }).catch(console.error);

    return;
  }

  let results = [];

  for (let i = start; i < end; i++) {
    let addr = `${(i >>> 24) & 0xFF}.${(i >>> 16) & 0xFF}.${(i >>> 8) & 0xFF}.${i & 0xFF}`;
    results.push(await scanPort(addr, 80, 1000));
  }

  parentPort.postMessage(results.filter(x => x));
}

这个scan函数可以接受起始IP地址和结束IP地址,并使用worker_threads模块在多线程环境下执行多个扫描任务。每个扫描任务都使用scanPort函数来尝试建立TCP80连接并发现Web服务器。如果连接成功,则会返回该IP地址,否则返回null。

  1. 发现Web服务器并输出地址

有了扫描结果之后,就可以筛选出其中的Web服务器并输出地址了。具体实现如下:

scan(min, max, results => {
  let servers = results.filter(x => x);

  if (servers.length > 0) {
    console.log(`Web servers found (${servers.length}):`);
    console.log(servers.join('\n'));
  } else {
    console.log('No Web servers found.');
  }
});

这段代码简单地输出了扫描结果,并将其中的Web服务器地址使用\n连接为一个长字符串输出。

示例说明1:

假设本地网络中有一台计算机开启了Web服务器并监听了80端口。

运行如下命令即可发现该服务器并输出其IP地址:

$ node scan.js
Web servers found (1):
192.168.0.101

示例说明2:

假设网络中没有开启Web服务器的计算机。

运行如下命令即可输出错误提示:

$ node scan.js
No Web servers found.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80) - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Node.js系列之安装配置与基本使用(1)

    以下是“Node.js系列之安装配置与基本使用(1)”完整攻略: Node.js系列之安装配置与基本使用(1) 安装Node.js 在官网上下载对应的安装程序进行安装,安装成功后,可以在终端上输入下面的命令行来检查是否安装成功: node -v npm -v 如果成功安装,就可以看到相应的版本号信息。 配置Node.js 我们可以使用npm安装一些第三方模块…

    node js 2023年6月8日
    00
  • linux 下部署nodejs项目(两种方式)

    下面是 “Linux下部署nodejs项目(两种方式)” 的完整攻略。 方式一:使用pm2部署 PM2 是一个 Node.js 的进程管理工具,可以帮助我们简化 Node.js 应用程序的部署和管理。 使用pm2部署nodejs项目的步骤如下: 1. 安装PM2 可以使用npm来安装: npm install -g pm2 2. 启动nodejs应用 我们假…

    node js 2023年6月8日
    00
  • vue使用jsonp抓取qq音乐数据的方法

    下面是详细讲解vue使用jsonp抓取qq音乐数据的方法的完整攻略。 步骤一:了解JSONP原理 JSONP是一种数据传输方式,它的原理是利用html的script标签没有跨域限制这一特性,在同一个页面中,通过向服务器请求一个jsonp类型的文件,服务器解析后返回数据,并在返回数据中添加一个函数调用语句,浏览器接收到响应文件后自动执行函数,从而实现了跨域访问…

    node js 2023年6月8日
    00
  • Node.js fs模块原理及常见用途

    Node.js中的fs模块提供了文件操作相关的API,它是Node.js核心模块之一,可以被任何一个模块所调用。 fs模块原理 文件读写原理: Node.js通过Libuv提供的异步IO进行文件读写,避免阻塞主线程。当文件读写操作完成后,将通过事件机制将结果告知Node.js执行环境。 文件读取流(Read Stream)原理: 文件读取流提供数据的读取,目…

    node js 2023年6月8日
    00
  • 用js简单提供增删改查接口

    下面就是用JS简单提供增删改查接口的完整攻略: 什么是增删改查接口 增删改查接口,英文名CRUD(C:Create R:Retrieve U:Update D:Delete),是Web前端开发中最常用的基本操作之一,用于实现数据的增加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)等操作。而JS简单提供增删改查接口,就是…

    node js 2023年6月8日
    00
  • 使用mock.js随机数据和使用express输出json接口的实现方法

    使用mock.js随机数据和使用express输出JSON接口的实现方法包括以下步骤: 1. 安装和配置mock.js模块 首先,需要安装和配置mock.js模块,它可以帮助我们生成随机数据。可以通过npm来安装mock.js,命令如下: npm install mockjs –save 安装完成后,在对应的js代码文件中,引入mock.js,并通过moc…

    node js 2023年6月8日
    00
  • 使用vue-cli初始化项目时运行‘npm run dev’报错及解决

    当使用vue-cli来初始化项目时,执行npm run dev命令时有可能出现各种类型的错误。这些错误可能会包括npm包的依赖关系、配置问题、端口占用等。在本文中,我们将介绍如何识别并解决其中的一些常见错误。 错误1:The System Cannot Find the Path Specified 这个错误通常意味着你没有正确设置项目的路径。例如,当你在W…

    node js 2023年6月8日
    00
  • 实例分析Array.from(arr)与[…arr]到底有何不同

    题目中提到的Array.from(arr)和[…arr]都可以将一个类数组对象或可迭代对象转换为一个真正的数组。但是,二者使用方法上却有些微小的差别。下面我将为大家做进一步的解释。 1. Array.from(arr) 1.1 Array.from(arr) 是一个方法 Array.from(arr)可以看成是一个静态方法,也就是说此方法属于Array对…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部