C # Добавление до <value>не осталось - For-loop - PullRequest
0 голосов
/ 22 марта 2012

5На сетевом калькуляторе у меня есть IP-адрес, введенный пользователем и подсетью, а также сетевой адрес для указанного IP-адреса хоста. (Рассчитали)

Все, что мне сейчас нужно, это создать цикл for, который будет считать вверх, пока не будет достигнут последний IP-адрес (широковещательный).

Итак,

int IP1 = 192,IP2 = 168,IP3 = 0,IP4 = 0, subnet = 255.255.0.0;// 192.168.0.0/16
int totalIPs = 65536; //hostbits^2

do
        {
            for (int a = IP1; a < 255; a++)
            {
                IP1++;
                for (int b = IP2; b < 255; b++)
                {
                    IP2++;
                    for (int c = IP3; c < 255; c++)
                    {
                        IP3++;
                        for (int d = IP4; d < 255; d++)
                        {
                            totalIPs= totalIPs - 1;
                            IP4++;
                        }
                        IP4 = 0;
                    }
                    IP3 = 0;
                }
                IP2 = 0;
            }
        }
        while (totalIPs > 0);

Я знаю, что с этим циклом for что-то ужасно не так, но я просто не могу этого понять.

Что мне нужно, так это широковещательный адрес, считая от исходного значения IP (в данном случае 192.168.0.0) и отсчитывая от него до последнего IP (теперь, когда мы знаем, сколько IP-адресов он должен считать)

Поэтому, когда октет 4 (d) достигает 255, октет 3 (c) поднимается на 1, затем сбрасывает октет 4 (d) и т. Д., Как часы.

Ответы [ 3 ]

1 голос
/ 22 марта 2012

Вам действительно не нужно проходить через все это, вы просто добавляете числа сюда.

Сначала вы делаете это:

int carry = 0;
IP4 += totalIPs;

carry = IP4 / 254;
IP4 = IP4 % 254;

if(carry>0) // Need to spill over IP3
{
   IP3 += carry;

   carry = IP3 / 254;
   IP3 = IP3 % 254;

   if(carry > 0)  // Spill over to IP2
   {
       IP2 += carry;

       carry = IP2 / 254;
       IP2 = IP2 % 254;

       IP1 += carry;
       IP1 %= 254;    // No spill-over here
   }
}

Это немного громоздко, потому что вы выбралииспользовать 4 дюйма для частей IP, но это будет сделано без петель.

0 голосов
/ 22 марта 2012

Или вы можете опираться на .NET Framework:

byte IP1 = 192, IP2 = 168, IP3 = 0, IP4 = 0;
int totalIPs = 65536;

int littleEndian = IP4 + (IP3 << 8) + (IP2 << 16) + (IP1 << 24) + totalIPs;
var bigEndian = BitConverter.GetBytes(littleEndian).Reverse().ToArray();
Console.WriteLine(new System.Net.IPAddress(bigEndian));
0 голосов
/ 22 марта 2012

Делает ли это то, что вы хотите?

int IP1 = 192, IP2 = 168, IP3 = 0, IP4 = 0;

for (int i1 = IP1; i1 < 256; i1++) {
    for (int i2 = IP2; i2 < 256; i2++) {
        for (int i3 = IP3; i3 < 256; i3++) {
            for (int i4 = IP4; i4 < 256; i4++) {
                string ip = String.Format("{0}.{1}.{2}.{3}", i1 i2, i3, i4);
                ...
            }
            IP4 = 0;
        }
        IP3 = 0;
    }
    IP2 = 0;
}
...