Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C#] Перебор всех ip адресов из диапазона


Автор: Apelsin 20.4.2009, 09:33
Подскажите пожалуйста, как реализовать цикл для перебора ип адресов из диапазона?
Например:
192.168.1.20 - 192.168.2.40
Код

string[] ipStart = txtStartIP.Text.Split('.');
string[] ipEnd = txtEndIP.Text.Split('.');

           for (int i1 = Int32.Parse(ipStart[0]); i1 <= Int32.Parse(ipEnd[0]); i1++)
                for (int i2 = Int32.Parse(ipStart[1]); i2 <= Int32.Parse(ipEnd[1]); i2++)
                    for (int i3 = Int32.Parse(ipStart[2]); i3 <= Int32.Parse(ipEnd[2]); i3++)
                        for (int i4 = Int32.Parse(ipStart[3]); i4 <= Int32.Parse(ipEnd[3]); i4++)

Вот такая конструкция тут не работает...
Если можно - очень подробно... Спасибо smile

Автор: mrbrooks 20.4.2009, 10:25
Apelsin, можно так - если именно такие айпишники - в противном случае надо проверять подгруппы отдельно

Код

            string ip_start = "192.168.1.20";
            string ip_end = "192.168.2.40";
            string[] arr_start = ip_start.Split('.');
            string[] arr_end = ip_end.Split('.');
            ip_start = ip_start.Remove(ip_start.LastIndexOf(".") + 1);
            ip_end = ip_end.Remove(ip_end.LastIndexOf(".") + 1);
            for (int i = int.Parse(arr_start[3]); i <= 255; i++) Console.WriteLine(ip_start + i);
            for (int i = 1; i <= int.Parse(arr_end[3]); i++) Console.WriteLine(ip_end + i);

Автор: Apelsin 20.4.2009, 18:02
Блин, таким образом как я понял очень неудобно перебирать ip.
Если начальный ип перевести в число и конечный ип перевести число, организовать цикл от начального до конечного и в цикле текущее значение ип переводить в строку - будет оч удобно.
Но есть но.
вот оно:
Код

for(long i1=   Int32.Parse(ipStart[0])*256*256*256+
                           Int32.Parse(ipStart[1])*256*256+
                           Int32.Parse(ipStart[2])*256+
                           Int32.Parse(ipStart[3]);

                      i1<= Int32.Parse(ipEnd[0])*256*256*256+
                           Int32.Parse(ipEnd[1])*256*256+
                           Int32.Parse(ipEnd[2])*256+
                           Int32.Parse(ipEnd[3]);
                           i1++)
{
и тут уже i1 переводить обратно в строчку и (для моего случая) пинговать его...
}

но значение выраженное жирным почему-то не помещается в лонг... Я себя чувствую идиотом... Где ошибка?smile
веть длина ип = 32 байта?!

Автор: mrbrooks 20.4.2009, 19:18
Цитата(Apelsin @  20.4.2009,  18:02 Найти цитируемый пост)
Если начальный ип перевести в число и конечный ип перевести число, организовать цикл от начального до конечного и в цикле текущее значение ип переводить в строку - будет оч удобно.

Не буду утверждать что парсинг строки - оптимальное решение, но твое решение - это жесть. smile 

Цитата(Apelsin @  20.4.2009,  18:02 Найти цитируемый пост)
но значение выраженное жирным почему-то не помещается в лонг... Я себя чувствую идиотом... Где ошибка?

я не понимаю зачем ты так делаешь.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)