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

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

  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日

相关文章

  • 如何将HTML字符转换为DOM节点并动态添加到文档中详解

    将HTML字符转换为DOM节点并动态添加到文档中,可以通过innerHTML属性、createRange和createContextualFragment方法、以及DOMParser接口来实现。 使用innerHTML属性 可以通过innerHTML属性将HTML字符串转换为DOM节点,并将这些节点添加到文档中。 // 获取包含HTML代码的字符串 cons…

    node js 2023年6月8日
    00
  • node学习笔记之读写文件与开启第一个web服务器操作示例

    下面详细讲解“node学习笔记之读写文件与开启第一个web服务器操作示例”的完整攻略。 读写文件 在 Node.js 中,可以使用 fs 模块来进行文件的操作。具体步骤如下: 引入 fs 模块:const fs = require(‘fs’) 使用 fs.readFile() 方法来读取文件内容,该方法需要传入两个参数:文件路径和回调函数。 文件路径可以是相…

    node js 2023年6月8日
    00
  • Nodejs异步流程框架async的方法

    Node.js异步流程框架async提供了一套强大的方法,可以帮助我们更好地处理异步操作。下面是async方法的详细攻略: async方法的概览 async方法是一个流程控制工具,它提供了一组有用的API,可以让我们更方便地处理异步操作。async方法可以分为以下六个类别: 控制流程:提供了一些方法,可以控制异步操作的流程,比如串行执行、并行执行等。 集合操…

    node js 2023年6月8日
    00
  • 详解nodejs模板引擎制作

    详解Node.js模板引擎制作 什么是模板引擎 模板引擎是一种将数据和模板文本结合起来产生新文本的工具。模板引擎允许我们使用模板文本生成我们需要的HTML、XML、JSON等格式的文本。互联网浏览器解析HTML是一件非常耗费性能的事情,而且HTML中可以嵌入静态资源、样式、脚本等,模板引擎可以将大量的相同或类似的内容进行复用,让前端渲染部分变得更加灵活和高效…

    node js 2023年6月8日
    00
  • [将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客

    下面是将免费进行到底在Amazon的一年免费服务器上安装Node.JS、NPM和OurJS博客的详细攻略。 确定Amazon实例类型 首先,我们需要在Amazon AWS上选择一种合适的实例类型。根据实际需求,我们可以选择不同的实例类型。此处我们选择性价比较高的t2.micro实例。选择该实例类型的原因在于其拥有1GB内存和1 vCPU的计算能力,并且可以免…

    node js 2023年6月8日
    00
  • nodejs入门教程六:express模块用法示例

    当HTTP服务器挡在JavaScript和浏览器之间时,node.js成为了非常有用的工具。而Express就是一个基于Node.js的最小化、灵活和高效的Web应用程序框架,本文将为大家讲解Express的用法。 安装Express 在使用Express之前,我们需要先安装它。在命令行中输入以下命令即可完成安装 npm install express 示例…

    node js 2023年6月7日
    00
  • node.js适合游戏后台开发吗?

    当谈到游戏后台开发时,Node.js 是否适合是一个值得讨论的话题。下面是一些关于这个话题的详细解释: Node.js的优势 Node.js是基于Chrome V8引擎的一种JavaScript运行时环境,它非常适合处理高并发的I/O密集型应用程序和网络应用程序。这使得它非常适合为游戏开发人员构建实时游戏后台。下面是一些关于Node.js优点的解释: 高性能…

    node js 2023年6月8日
    00
  • node.js中的buffer.Buffer.isBuffer方法使用说明

    下面来详细讲解“node.js中的buffer.Buffer.isBuffer方法使用说明”的完整攻略。 什么是Buffer Buffer是Node.js中的一个全局构造函数,它提供了对二进制数据的操作。Buffer的实例类似于整数数组,但Buffer的大小是固定的,它无法对其大小进行更改。 Buffer.isBuffer方法 Buffer.isBuffer…

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