Puede usar la clase eExNetworkLibrary.IP.IPAddressAnalysis desde eExNetworkLibrary.
El siguiente código funciona con IPv4 e IPv6 (apenas probado).
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();
no estoy completamente seguro de si he hecho la conversión de la longitud de prefijo a una matriz de bytes que contiene la máscara de subred correcta, pero el código que debería darle un buen punto de partida.
Editar: Actualicé la parte de doblar bits del código. Puede ser feo, pero funciona para este ejemplo. Creo que serás capaz de encontrar una mejor solución, si es necesario. Esas BitArrays son un dolor en el cuello.
Tenga en cuenta que generar un rango de red IPv6 puede ser una tarea muy agotadora de memoria/CPU si la red es grande.
es probable que tenga que replantearse su funcionalidad. Por diseño, casi cualquier subred que verá en IPv6 será/64, o (2^64) -1 hosts de gran tamaño. – Joe
Eso es correcto, quiero las 18,446,744,073,709,551,616 direcciones IP;) – DaveUK
¿Y qué vas a hacer con ellas? Incluso a 10 millones por segundo, necesitarías 58,000 años para revisarlos todos. – Joe