Bạn có thể sử dụng lớp eExNetworkLibrary.IP.IPAddressAnalysis từ eExNetworkLibrary.
Mã sau hoạt động với IPv4 và IPv6 (chỉ được kiểm tra).
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();
Tôi không hoàn toàn chắc chắn nếu tôi đã làm việc chuyển đổi từ độ dài tiền tố để một mảng byte chứa subnet mask đúng, nhưng mã này sẽ cho bạn một điểm khởi đầu tốt.
Chỉnh sửa: Cập nhật phần uốn bit của mã. Có thể xấu xí, nhưng hoạt động cho ví dụ này. Tôi nghĩ rằng bạn sẽ có khả năng tìm kiếm một giải pháp tốt hơn, nếu bạn cần. Những BitArrays là một cơn đau ở cổ.
Lưu ý rằng việc tạo phạm vi mạng IPv6 có thể là tác vụ hết sức bộ nhớ/cpu nếu mạng lớn.
Bạn có lẽ cần phải suy nghĩ lại chức năng của mình. Theo thiết kế, hầu như mọi subnet bạn sẽ thấy ở IPv6 sẽ là/64, hoặc (2^64) -1 host lớn. – Joe
Đúng vậy, tôi muốn tất cả 18,446,744,073,709,551,616 địa chỉ IP;) – DaveUK
Và bạn sẽ làm gì với chúng? Ngay cả ở mức 10 triệu giây, bạn cần 58.000 năm để trải qua tất cả. – Joe