go - 计算CIDR的主机数量

在网络中,CIDR /32 表示该地址只能用作网络地址本身,不能分配给任何主机。因此,在计算主机数量时,应将 CIDR 地址按照其位掩码长度进行区分。对于 /32 子网掩码,主机数量总是为 1,而不是 -1。

以下是修正后的代码,可以正确地处理 /32 CIDR 地址:

Go 复制代码
package main

import (
	"fmt"
	"math"
	"net"
)

func main() {
	cidr := "10.22.2.1/32"
	hostCount, err := calculateHostCount(cidr)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("Number of hosts in %s: %d\n", cidr, hostCount)
}

func calculateHostCount(cidr string) (int, error) {
	_, ipNet, err := net.ParseCIDR(cidr)
	if err != nil {
		return 0, err
	}

	maskLen, _ := ipNet.Mask.Size()
	if maskLen == 32 {
		return 1, nil
	}

	hostCount := int(math.Pow(2, float64(32-maskLen))) - 2

	return hostCount, nil
}
复制代码

通过添加了对 /32 子网掩码的特殊处理,现在代码会返回正确的主机数量 1,而不是 -1。

相关推荐
Johny_Zhao11 分钟前
基于CentOS Stream 8的物联网平台深度优化方案
linux·网络·网络安全·信息安全·云计算·shell·yum源·系统运维
Li_yizYa12 小时前
网络原理 | TCP协议的常见核心机制
网络·网络协议·tcp/ip
暮色_年华12 小时前
《TCP/IP协议卷1》第3章 IP协议
网络
galaxylove12 小时前
Gartner发布新的网络安全运营模型:决定安全运营的9个组件
网络·安全·web安全
K·Herbert12 小时前
最新CentOS 7 yum源失效的解决方案(2025年6月)
linux·运维·centos
别骂我h13 小时前
部署KVM虚拟化平台
linux·运维·服务器
繢鴻13 小时前
紧急救援!Ubuntu崩溃修复大赛
linux·服务器·ubuntu
showmethetime13 小时前
优化nginx参数(基本通用参数)
运维·nginx
老六ip加速器13 小时前
获取ip地址安全吗?如何获取静态ip地址隔离ip
运维·网络·智能路由器
领世达检测V1335290924913 小时前
蓝牙戒指欧盟EN 18031网络安全认证详细解读
网络