fix(network): 修复网段 total_ips 包含网络地址和广播地址的问题

问题原因:
- calculate_total_ips 使用 network.num_addresses 计算总IP数量
- 该值包含网络地址(第一个IP)和广播地址(最后一个IP)
- 而 _create_ip_addresses 使用 hosts() 生成IP列表,排除这两个地址
- 导致 total_ips 比实际存储的IP记录多2个
- 例: /24 显示 256 个IP,实际只有 254 条记录

解决方案:
1. calculate_total_ips 改为 num_addresses - 2(排除网络地址和广播地址)
2. 对于 /31 /32 等没有网络/广播地址的网段,特殊处理
3. 提供 fix_network_total_ips.py 迁移脚本修复已有数据
This commit is contained in:
Your Name
2026-07-23 15:33:13 +08:00
parent 05cd71ca1a
commit 13c457acb3
2 changed files with 41 additions and 2 deletions
+2 -2
View File
@@ -14,9 +14,9 @@ class NetworkService:
@staticmethod
def calculate_total_ips(cidr: str) -> int:
"""计算网段的总IP数量"""
"""计算网段中实际分配的IP数量(排除网络地址和广播地址)"""
network = ipaddress.ip_network(cidr, strict=False)
return network.num_addresses
return network.num_addresses - 2 if network.num_addresses > 2 else network.num_addresses
@staticmethod
def get_network_addresses(cidr: str) -> List[str]: