使用node.js编写端口扫描工具(第二部分代码)

发布时间 2023-03-25 01:18:43作者: 项希盛

用于读取命令行中的需要转换的参数值

function getOptionValue(option, arg) {
  if (option.type === "bool") {
    return arg;
  }

  if (option.type === "number") {
    const value = parseInt(arg, 10);
    if (isNaN(value)) {
      throw new Error(`Invalid value for option '${option.name}': '${arg}'`);
    }
    if (option.min && value < option.min) {
      throw new Error(`Value for option '${option.name}' must be greater than or equal to ${option.min}`);
    }
    if (option.max && value > option.max) {
      throw new Error(`Value for option '${option.name}' must be less than or equal to ${option.max}`);
    }
    return value;
  }

  if (option.type === "range") {
    const result = [];
    const ranges = arg.split(",");
    for (let range of ranges) {
      range = range.trim();
      const parts = range.split("-");
      if (parts.length === 1) {
        // Single port
        const value = parseInt(parts[0], 10);
        if (isNaN(value)) {
          throw new Error(`Invalid value for option '${option.name}': '${range}'`);
        }
        if (option.min && value < option.min) {
          throw new Error(`Value for option '${option.name}' must be greater than or equal to ${option.min}`);
        }
        if (option.max && value > option.max) {
          throw new Error(`Value for option '${option.name}' must be less than or equal to ${option.max}`);
        }
        result.push(value);
      } else if (parts.length === 2) {
        // Port range
        const start = parseInt(parts[0], 10);
        const end = parseInt(parts[1], 10);
        if (isNaN(start) || isNaN(end)) {
          throw new Error(`Invalid value for option '${option.name}': '${range}'`);
        }
        if (option.min && start < option.min) {
          throw new Error(`Value for option '${option.name}' must be greater than or equal to ${option.min}`);
        }
        if (option.max && end > option.max) {
          throw new Error(`Value for option '${option.name}' must be less than or equal to ${option.max}`);
        }
        if (start > end) {
          throw new Error(`Invalid range for option '${option.name}': '${range}'`);
        }
        for (let i = start; i <= end; i++) {
          result.push(i);
        }
      } else {
        throw new Error(`Invalid value for option '${option.name}': '${range}'`);
      }
    }
    return result;
  }
}

接下来看第三部分