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。

相关推荐
Mr_sun.几秒前
Docker中安装软件汇总(留存版)
运维·docker·容器
古城小栈4 分钟前
MCP协议 与 Function Call 的有点分不清楚
网络·网络协议
weixin_3077791312 分钟前
Jenkins Jackson 2 API插件详解:JSON处理的基础支柱
运维·开发语言·架构·json·jenkins
深圳南柯电子16 分钟前
物联照明EMC整改:技术攻坚到系统化方案的全链路突破|南柯电子
网络·人工智能·互联网·实验室·emc
徐子元竟然被占了!!17 分钟前
Linux-du
linux·运维·服务器
m0dw21 分钟前
原生websocket简单介绍
网络·websocket·网络协议
Howe~zZ27 分钟前
mybatis 报错解决方案ORA-01795: maximum number of expressions in a list is 1000
java·服务器·前端
Awkwardx27 分钟前
Linux网络编程—传输层协议UDP和TCP
linux·网络·tcp/ip·udp
乐迪信息31 分钟前
乐迪信息:AI摄像机+反光衣佩戴检测,保障智慧煤矿人员作业安全
大数据·运维·人工智能·物联网·安全
程序猿编码31 分钟前
Linux内核模块实现TCP连接强制断开机制
linux·网络·tcp/ip·内核·内核模块