Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перебор IP диапазона

9.0K
20 июня 2010 года
elvenoracle
56 / / 16.04.2007
Добрый день.
Каким образом можно перебрать диапазон IP адресов? Например с 192.168.1.1 до 192.168.4.128?
Спасибо.
1.8K
20 июня 2010 года
LM(AL/M)
332 / / 20.12.2005
привести оба адреса к 32-разрядным целым числам (ip -- это стурктура из 4-х 1-байтных чисел, если не знаете) и сделать цикл от меньшего числа к большему. в цикле производить обратное преобразование счётчика к ip
9.0K
20 июня 2010 года
elvenoracle
56 / / 16.04.2007
Цитата: LM(AL/M)
привести оба адреса к 32-разрядным целым числам (ip -- это стурктура из 4-х 1-байтных чисел, если не знаете) и сделать цикл от меньшего числа к большему. в цикле производить обратное преобразование счётчика к ip



не могли бы Вы привести пример, а то все-равно не соображу?

1.8K
20 июня 2010 года
LM(AL/M)
332 / / 20.12.2005
если предположить что для хранения ip-адреса используется массив, то вот
Код:
long unsigned int ipToInt(unsigned char ip[])
{
    return ((ip[0]*256 + ip[1])*256 + ip[2])*256 + ip[3];
}

void intToIp(int i, char ip[])
{
    char* p = (char*) &i;
    ip[0] = p[3];
    ip[1] = p[2];
    ip[2] = p[1];
    ip[3] = p[0];
}

void print_ip(char* ip)
{
        // спецификаторы формата для lcc...
    printf("%hhu.%hhu.%hhu.%hhu\n", ip[0], ip[1], ip[2], ip[3]);
}

// ... main ...
char loopIp[4], ip1[4] = {192, 168, 1, 1}, ip2[4] = {192, 168, 4, 128};
long unsigned int i1, i2;

i1 = ipToInt(ip1);
i2 = ipToInt(ip2);

for (int i = i1; i <= i2; i++)
{
    intToIp(i, loopIp);
    print_ip(loopIp);
}
8.4K
20 июня 2010 года
z0rch
275 / / 02.09.2008
я так полагаю, LM(AL/M) вам рассказал вот это. Это кстати говоря, очень интересный метод, пример там же есть.
Только вот, если вы будете перебирать такие ip-адреса, которые вы указали в своем примере (есть заведомо одинаковые значения), то не стоит, наверное, их вообще рассматривать, так будете работать с гораздо меньшими числами.
9.0K
20 июня 2010 года
elvenoracle
56 / / 16.04.2007
В perl для этого использую Net::IP, думал что на java есть что-то подобное
1.8K
20 июня 2010 года
LM(AL/M)
332 / / 20.12.2005
Цитата: z0rch
я так полагаю, LM(AL/M) вам рассказал вот это.


да, получается что именно это я и рассказал ), но это только потому что для примера я выбрал самую простую (для меня) реализацию intToIp(), если же там не использовать хак с приведением типов, а сделать через сдвиги и бинарные операции то порядок байт принятый в системе на аппаратном уровне будет безразличен

9.0K
21 июня 2010 года
elvenoracle
56 / / 16.04.2007
Вобщем с горя пополам вот что получилось :
Код:
public class Main {

    public static int ipToInt(char ip[]) {
        return ((ip[0]*256 + ip[1])*256 + ip[2])*256 + ip[3];
            }

    public static String intToIp(long i) {
        return ((i >> 24 ) & 0xFF) + "." +
               ((i >> 16 ) & 0xFF) + "." +
               ((i >>  8 ) & 0xFF) + "." +
               ( i        & 0xFF);
    }
    public static void print_ip(char[] ip) {
        System.out.println("qwe" + ip[0]);
    }


    public static void main(String[] args) {
            char[] ip1 = new char[4];
            ip1[0] = 192;
            ip1[1] = 168;
            ip1[2] = 1;
            ip1[3] = 1;
            char[] ip2 = new char[4];
            ip2[0] = 192;
            ip2[1] = 168;
            ip2[2] = 2;
            ip2[3] = 128;
            long i1;
            long i2;
            i1 = ipToInt(ip1);
            i2 = ipToInt(ip2);
            System.out.println(i1);
            System.out.println(i2);
            for (long i = i1; i <= i2; i++) {
                String result;
                result = intToIp(i);
                System.out.println(result);
            }

}
    }


Огромное спасибо за помощь!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог