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を使い果たすタスクになる可能性があることに注意してください。
。設計上、IPv6で見られるほとんどすべてのサブネットは/ 64、または(2^64)-1のホストが大きくなります。 – Joe
それは正しいです、私はすべての18,446,744,073,709,551,616のIPアドレスが必要です;) – DaveUK
そしてあなたはそれらで何をしますか? 1秒間に1000万回でさえ、それらをすべて通過するには58,000年が必要です。 – Joe