public List <IPv4> GetIPRange(VLSM.VLSM_Units vlsm_units) { List <IPv4> listIPs = new List <IPv4>(); List <int> listCurrBits = this.ToBinaryList(); BinaryNumber borrowedBits = new BinaryNumber(bitsAmount: 32 - this.Suffix); int startHostIndex = this.Suffix; for (int i = 0; i < vlsm_units.Hop; ++i) { int assignedCounter = 0; for (int j = 0; j < 32; ++j) { if (j >= startHostIndex) { listCurrBits[j] = borrowedBits.ListBits[assignedCounter++]; } if (assignedCounter == borrowedBits.ListBits.Count) { break; } } listIPs.Add(new IPv4(listCurrBits, this.Suffix)); borrowedBits.Increase(); // Giới hạn khi có quá nhiều Subnets if (listIPs.Count == 2 && vlsm_units.Hop > 4) { for (int j = 0; j < borrowedBits.Length - 1; ++j) { borrowedBits.ListBits[j] = 1; } borrowedBits.ListBits[borrowedBits.Length - 1] = 0; i = vlsm_units.Hop - 3; } } return(listIPs); }
private static VLSM__RESULT DivideNewSubnets(VLSM_Units vlsm_units, List <IPv4> listSubnets, Branch currBranch) { // Lấy ra IP cuối cùng (đường mạng tiếp theo) để chia IPv4 currIP = listSubnets.Last(); WriteNetAddressFormat(currIP, vlsm_units); Guides += Environment.NewLine; // Các bit đã mượn để bật bit thành các đường mạng BinaryNumber borrowedBits = new BinaryNumber(bitsAmount: vlsm_units.BorrowedBitsAmount); //List các đường mạng con được sinh ra khi bật bit List <IPv4> listNewSubnets = new List <IPv4>(); // Xác định index của bit mượn đầu tiên trong IP (bắt đầu từ 1) int startBorrowingBitIndex = 32 - vlsm_units.BeforeHosts + 1; // List các bit của IP hiện tại List <int> listCurrBits = currIP.ToBinaryList(); // Bật các bit mượn lên IP hiện tại để tính ra các đường mạng con for (int i = 0; i < vlsm_units.SubnetsAmount; ++i) { int assignedCounter = 0; for (int j = 0; j < 32; ++j) { if (j + 1 >= startBorrowingBitIndex) { listCurrBits[j] = borrowedBits.ListBits[assignedCounter++]; } if (assignedCounter == borrowedBits.ListBits.Count) { break; } } // Thêm mạng con mới vào list tạm thời listNewSubnets.Add(new IPv4(listCurrBits, currIP.Suffix + vlsm_units.BorrowedBitsAmount)); Guides += $@" M{listNewSubnets.Count}: {listNewSubnets.Last().DecimalStringValue}"; Guides += Environment.NewLine; // Bật bit borrowedBits.Increase(); // Dừng lấy thêm đường mạng khi đã đủ if (listNewSubnets.Count == branchesAmount) { if (branchesAmount < vlsm_units.SubnetsAmount) { Guides += $@" ...{Environment.NewLine}"; } break; } } if (listNewSubnets.Count == 0) { System.Windows.Forms.MessageBox.Show($"An error just occured! Don't enough HOST BITS to divide new subnets for {currBranch.Name}", "Alert", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); return(null); } else { // Xoá phần tử đã được chia listSubnets.Remove(currIP); // Đảo ngược thứ tự của các phần tử mới listNewSubnets.Reverse(); // Thêm các phần tử mới vào list listSubnets.AddRange(listNewSubnets); // Chọn phần tử cuối cùng (tương đương với mạng con thứ nhất mới được chia) currIP = listSubnets.Last(); // Xoá phần tử được chọn listSubnets.Remove(currIP); } VLSM__RESULT result = listNewSubnets.Count == 0 ? null : GetVLSM_Result_Item(currIP, currBranch, vlsm_units); if (result != null) { Guides += $@"{Environment.NewLine} Select M1 to apply:"; WriteHostFormat(currIP, vlsm_units); WriteResultIPs(result); } // Trả về item kết quả return(result); }