2012-02-10 3 views
12

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

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.

+0

В Java нет такой вещи, как out-parameters –

+0

Что это значит. Я не мог понять? – AKIWEB

+0

О, неважно; Я думал, что вы хотите присвоить что-то p1/p2/p3, но я слишком быстро ответил. Все еще не уверены, что должна произойти модификация ('p3 + = inc;' и т. Д.) После вызова 'generateIPAddress'. Я должен был сказать: Java не имеет статических переменных уровня метода, так как модификация p1/p2/p3 будет потеряна после выхода из области метода. –

ответ

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

Это генерирует целую кучу сомнительных адресов; такие как 0.0.0.0 и 255.255.255.255, а также диапазоны частных IP-адресов и многоадресные адреса. – joev

+1

255.255.255.255 - универсальный широковещательный адрес. используйте это с осторожностью! – 0xBAADF00D

9

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

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

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

+0

Этот ответ имеет те же недостатки, что и принятый ответ, и может генерировать IP-адреса, такие как '0.0.0.0' и' 255.255.255.255'. –

+0

Поддерживает ли эта библиотека создание случайного IPv6 IP на основе данной подсети? – Arya

0

Предполагая, что вы действительно не заботитесь о том, что результирующий 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, потому что оно никогда не устанавливается, но должно создавать адреса.

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

0

При вызове 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 ...

1

Я недавно разработал small library, который может генерировать случайные адреса 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] 
+0

Я пробовал, и это хорошо! CLASS_A исключает CLASS_A_PRIVATE? –

+0

Нет, это не так. Это включено. –

+0

О, спасибо. Поэтому я, похоже, не могу получить адрес, который не является приватным. –

Смежные вопросы