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。

相关推荐
where happens10 分钟前
centos创建目录并授予权限
linux·运维·服务器·centos
liebe1*125 分钟前
第七章 防火墙地址转换
运维·服务器·网络
好好学操作系统31 分钟前
autodl 保存 数据 跨区
linux·运维·服务器
dbitc34 分钟前
WIN11把WSL2移动安装目录
linux·运维·ubuntu·wsl
KingRumn34 分钟前
Linux同步机制之信号量
linux·服务器·网络
嵌入式学习菌34 分钟前
SPIFFS文件系统
服务器·物联网
旺仔Sec34 分钟前
2026年度河北省职业院校技能竞赛“Web技术”(高职组)赛项竞赛任务
运维·服务器·前端
BullSmall1 小时前
linux 根据端口查看进程
linux·运维·服务器
herinspace1 小时前
管家婆软件年结存后快马商城操作注意事项
服务器·数据库·windows
嘻哈baby1 小时前
DDNS动态域名解析方案对比与实战配置
网络