gpt4 book ai didi

c# - 计算子网内的所有地址...对于 IPv6

转载 作者:太空狗 更新时间:2023-10-29 20:08:27 24 4
gpt4 key购买 nike

我见过很多很棒的 C# examples其中演示了如何将 CIDR 表示法(例如 192.168.0.1/25)中提供的 IPv4 地址转换为其相关范围(192.168.0.1 - 192.168.0.126)。我的程序需要能够执行此操作(以计算本地子网内的所有地址),但我还想支持 IPv6。

如果我的 C# 程序具有我的所有典型 ipconfig 信息(IPv4 地址、子网掩码、IPv6 地址、链接本地 v6 地址、默认网关)——我将如何生成我的所有 IPv6 地址的列表本地子网并将它们输出到控制台?

最佳答案

您可以使用 eExNetworkLibrary 中的 eExNetworkLibrary.IP.IPAddressAnalysis 类.

以下代码适用于 IPv4 和 IPv6(刚刚测试)。

        string strIn = "2001:DB8::/120";

//Split the string in parts for address and prefix
string strAddress = strIn.Substring(0, strIn.IndexOf('/'));
string strPrefix = strIn.Substring(strIn.IndexOf('/') + 1);

int iPrefix = Int32.Parse(strPrefix);
IPAddress ipAddress = IPAddress.Parse(strAddress);

//Convert the prefix length to a valid SubnetMask

int iMaskLength = 32;

if(ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
{
iMaskLength = 128;
}

BitArray btArray = new BitArray(iMaskLength);
for (int iC1 = 0; iC1 < iMaskLength; iC1++)
{
//Index calculation is a bit strange, since you have to make your mind about byte order.
int iIndex = (int)((iMaskLength - iC1 - 1) / 8) * 8 + (iC1 % 8);

if (iC1 < (iMaskLength - iPrefix))
{
btArray.Set(iIndex, false);
}
else
{
btArray.Set(iIndex, true);
}
}

byte[] bMaskData = new byte[iMaskLength / 8];

btArray.CopyTo(bMaskData, 0);

//Create subnetmask
Subnetmask smMask = new Subnetmask(bMaskData);

//Get the IP range
IPAddress ipaStart = IPAddressAnalysis.GetClasslessNetworkAddress(ipAddress, smMask);
IPAddress ipaEnd = IPAddressAnalysis.GetClasslessBroadcastAddress(ipAddress, smMask);

//Omit the following lines if your network range is large
IPAddress[] ipaRange = IPAddressAnalysis.GetIPRange(ipaStart, ipaEnd);

//Debug output
foreach (IPAddress ipa in ipaRange)
{
Console.WriteLine(ipa.ToString());
}

Console.ReadLine();

我不完全确定我是否已经正确地完成了从前缀长度到包含子网掩码的字节数组的转换,但是这段代码应该给你一个很好的起点。

编辑:更新了代码的位弯曲部分。可能很难看,但适用于此示例。如果需要,我认为您将能够找到更好的解决方案。那些 BitArrays 让人头疼。

请注意,如果网络很大,生成 IPv6 网络范围可能是一项非常消耗内存/CPU 的任务。

关于c# - 计算子网内的所有地址...对于 IPv6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com