Подтвердить что ты не робот

Создание случайного IP-адреса

Я хочу создать случайный IP-адрес. Но в evertime эта функция generateIPAddress возвращает строку 0.0.0.0 как ipAddress. Но он должен возвращать некоторый случайный ipAddress, отличный от 0.0.0.0 каждый раз. Любые предложения, почему это происходит?

private void callingGeoService() {
        int p1 = 255;
        int p2 = 0;
        int p3 = 0;
        int inc = 5;

        String ipAddress = generateIPAddress(p1, p2, p3);

        p3 += inc;
        if (p3 > 255) {
            p3 = 0;
            p2 += inc;
            if (p2 > 255) {
                p2 = 0;
                p1--;
                if (p1 <= 0) {
                    p1 = 0;
                }
            }
        }
    }

//Это метод generateIPAddress

private String generateIPAddress(int p1, int p2, int p3) {

    StringBuilder sb = null;

    int b1 = (p1 >> 24) & 0xff;
    int b2 = (p2 >> 16) & 0xff;
    int b3 = (p3 >>  8) & 0xff;
    int b4 = 0;

    String ip1 = Integer.toString(b1);
    String ip2 = Integer.toString(b2);
    String ip3 = Integer.toString(b3);
    String ip4 = Integer.toString(b4);

    //Now the IP is b1.b2.b3.b4
    sb = new StringBuilder();
    sb.append(ip1).append(".").append(ip2).append(".").append(ip3).append(".").append(ip4);
    // System.out.println(sb);

    return sb.toString();

}

Мне нужен какой-то случайный ipAddress в основном, так что у меня есть жестко заданные биты ipAddress в форме p1, p2, p3, а последний бит должен быть 0.

4b9b3361

Ответ 1

Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);

Ответ 2

Использование Google Guava:

import com.google.common.net.InetAddresses;
...
String ipString = InetAddresses.fromInteger(random.nextInt()).getHostAddress();

конечно, вы можете проверить, что результирующий адрес не будет многоадресной и т.д.

Ответ 3

Недавно я разработал небольшую библиотеку которая может генерировать случайные адреса IPv4 с использованием ограничений типа:

    MockNeat mock = MockNeat.threadLocal();

    String ipv4 = mock.ipv4s().val();
    System.out.println(ipv4);

    String ipClassA = mock.ipv4s().type(CLASS_A).val();
    System.out.println(ipClassA);

    String classAorB = mock.ipv4s().types(CLASS_A, CLASS_B).val();
    System.out.println(classAorB);

    List<String> ip4s = mock.ipv4s().list(10).val();
    System.out.println(ip4s);

Вывод:

192.112.222.183
120.178.110.193
143.68.176.47
[112.246.76.178, 29.201.72.151, 67.105.2.128, 102.189.109.206, 157.146.176.212, 59.220.145.35, 47.171.185.233, 162.245.163.124, 19.203.21.194, 114.177.238.50]

Ответ 4

Предполагая, что вы действительно не заботитесь о том, что результирующий IP-адрес действителен в какой-либо форме, у вас есть простая проблема.

Код для создания адресов задает параметры p3 и p2 чем-то меньше 255. p1 находится в ловушке между 255 и 0.

Реальная проблема заключается в том, что код, который превращает это в адрес, смещает эти значения. p1 на 24, p2 на 16 и p3 на 8. Понимая ограничение, применяемое в вызывающем методе, вы можете знать, что p1, p2 и p3 никогда не превысят 255, поэтому в этом случае, зная, что сдвиг 8 или более приведет к 0, ни один из отдельных элементов адреса не приведет к значению, отличному от 0, а последний октет всегда будет 0, поэтому результирующий адрес будет 0.0.0.0

Если вы хотите, чтобы он не был 0.0.0.0, первое, что нужно сделать, это удалить операции смены. Это все равно будет содержать последнее поле как 0, потому что оно никогда не устанавливается, но должно вызывать адреса.

Опять же, это не касается состояния адресов, в этом случае вы будете использовать широковещательные, многоадресные и локальные адреса.

Ответ 5

Когда вы вызываете generateIPAddress(p1, p2, p3), p1 является 255, p2 и p3 являются 0.

Эта строка

int b1 = (p1 >> 24) & 0xff;

сдвигает p1 24 бита вправо. До сдвига p1 было 11111111. Результаты сдвига с 0. На самом деле вы также можете использовать

int b1 = p1 >> 8;

поскольку p1 имеет только 8 младших значащих бит. Использование & 0xff избыточно, так как операция находится между двумя операндами int. Итак, b1 0.

p2 и p3 передаются со значением 0, поэтому сдвиг (либо на 16, либо 8) не меняет его на один бит, в результате чего b2 и b3 также 0.

b4 явно установлен на 0.

Таким образом, все b1, b2, b3 и b4 являются 0, из которых вы создаете ip1 в ip4. Поэтому метод generateIPAddress(p1, p2, p3) всегда возвращает 0.0.0.0.

Затем p3 += inc; добавляет 5 в 0. Reuslt в p3 теперь 5.

Условие if (p3 > 255) всегда будет терпеть неудачу, поскольку p3 - 5, который равен < 255...