网络工具函数
2024/9/9大约 3 分钟
本文档整理了常用的网络工具函数。
根据 IP 地址和子网掩码计算 IP 地址范围
实现代码
/**
* 计算IP地址范围
*
* @param {string} ip - IP地址
* @param {string} subnetMask - 子网掩码
* @returns {Array<string>} 返回IP地址范围的起始和结束地址
*/
function calculateIpRange(ip, subnetMask) {
const ipLong = ipToLong(ip);
const maskLong = ipToLong(subnetMask);
// 计算网络地址
const networkAddress = ipLong & maskLong;
// 计算广播地址
// 首先将子网掩码取反(得到反向掩码),然后与IP地址进行按位或操作
const broadcastAddress = ipLong | ~maskLong;
// 转换回点分十进制
const startIp = longToIp(networkAddress);
const endIp = longToIp(broadcastAddress);
return getAllIpsInRange(startIp, endIp);
}
/**
* 获取IP地址范围内的所有IP地址
*
* @param {string} startIp - 起始IP地址
* @param {string} endIp - 结束IP地址
* @returns {Array<string>} 包含起始到结束范围内所有IP地址的数组
*/
function getAllIpsInRange(startIp, endIp) {
const start = ipToLong(startIp);
const end = ipToLong(endIp);
const ips = [];
for (let ip = start; ip <= end; ip++) {
ips.push(longToIp(ip));
}
return ips;
}
/**
* 将IP地址转换为长整型数字
*
* @param {string} ip - IP地址字符串,格式为xxx.xxx.xxx.xxx
* @returns {number} 转换后的长整型数字
*/
function ipToLong(ip) {
const parts = ip.split(".");
return (
(parseInt(parts[0], 10) << 24) |
(parseInt(parts[1], 10) << 16) |
(parseInt(parts[2], 10) << 8) |
parseInt(parts[3], 10)
);
}
/**
* 将长整型IP地址转换为字符串形式的IP地址
*
* @param {number} ipLong - 长整型IP地址
* @returns {string} 字符串形式的IP地址
*/
function longToIp(ipLong) {
return [
(ipLong >>> 24).toString(10),
((ipLong >> 16) & 0xff).toString(10),
((ipLong >> 8) & 0xff).toString(10),
(ipLong & 0xff).toString(10),
].join(".");
}
代码解析
IP 地址转换:
ipToLong
函数将点分十进制格式的 IP 地址转换为长整型数字,便于数学运算和比较longToIp
函数则执行相反的操作,将长整型数字转回点分十进制格式
网络地址计算:
calculateIpRange
函数首先将 IP 地址和子网掩码转换为长整型- 通过按位与运算(&)计算网络地址
- 通过按位非(~)和按位或(|)运算计算广播地址
地址范围生成:
getAllIpsInRange
函数通过循环遍历从起始地址到结束地址的所有 IP 地址- 并将每个长整型 IP 地址转换回字符串形式,最终返回完整的 IP 地址列表
使用方法
// 示例1:计算指定IP和子网掩码的地址范围
function getNetworkRange() {
try {
// 指定IP地址和子网掩码
const ip = "192.168.1.100";
const subnetMask = "255.255.255.0";
// 计算IP地址范围
const ipRange = calculateIpRange(ip, subnetMask);
// 输出结果
console.log(`网络地址: ${ipRange[0]}`);
console.log(`广播地址: ${ipRange[ipRange.length - 1]}`);
console.log(`该子网共有 ${ipRange.length} 个可用IP地址`);
// 显示前5个IP地址
console.log("前5个IP地址:", ipRange.slice(0, 5).join(", "));
} catch (error) {
console.error("计算IP范围失败:", error);
}
}
// 示例2:检查一个IP是否在指定范围内
function isIpInRange(checkIp, startIp, endIp) {
const checkIpLong = ipToLong(checkIp);
const startIpLong = ipToLong(startIp);
const endIpLong = ipToLong(endIp);
return checkIpLong >= startIpLong && checkIpLong <= endIpLong;
}
// 调用示例
getNetworkRange();
// 检查IP是否在范围内
const isInRange = isIpInRange("192.168.1.50", "192.168.1.1", "192.168.1.254");
console.log("IP是否在范围内:", isInRange);
更新日志
2025/9/28 09:03
查看所有更新日志
38e56
-于