예제 #1
0
        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);
        }
예제 #2
0
        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);
        }