2012-02-10 22 views
12

Desidero generare un indirizzo IP casuale. Ma al tempo stesso questa funzione generateIPAddress restituisce 0.0.0.0 stringa come ipAddress. Ma dovrebbe ritornare qualche indirizzo ip casuale diverso da 0.0.0.0 ogni volta. Qualche suggerimento perché sta succedendo?Genera indirizzo IP casuale

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; 
       } 
      } 
     } 
    } 

// Questo è il metodo 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(); 

} 

Voglio un po 'casuale ipAddress fondamentalmente così ho hardcoded partire bit indirizzoip in forma di p1, p2, p3 e ultimo bit dovrebbe essere 0.

+0

Java non ha una cosa come parametri esterni –

+0

Cosa significa? Non ero in grado di capire? – AKIWEB

+0

Oh, non importa; Ho pensato che volessi assegnare qualcosa a p1/p2/p3, ma ho risposto un po 'troppo velocemente. Non si sa ancora cosa dovrebbe fare la modifica ('p3 + = inc;' ecc.) Dopo aver chiamato 'generateIPAddress'. Avrei dovuto dire: Java non ha variabili statiche a livello di metodo, poiché la modifica di p1/p2/p3 andrà persa dopo aver abbandonato l'ambito del metodo. –

risposta

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

Questo genera un sacco di indirizzi discutibili; cose come 0.0.0.0 e 255.255.255.255, così come intervalli di indirizzi IP privati ​​e indirizzi multicast. – joev

+1

255.255.255.255 è l'indirizzo di trasmissione universale. usa questo con le precauzioni! – 0xBAADF00D

9

Utilizzando Google Guava:

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

ovviamente è possibile convalidare l'indirizzo risultante da non multicast ecc.

+0

Questa risposta ha gli stessi difetti della risposta accettata e potrebbe generare indirizzi IP come '0.0.0.0' e' 255.255.255.255'. –

+0

Questa libreria supporta la generazione di un IPv6 IP casuale basato su una determinata subnet? – Arya

0

Supponendo che non si preoccupi effettivamente dell'indirizzo IP risultante valido in qualsiasi forma, si ha un semplice problema.

Il codice per la generazione degli indirizzi imposta i parametri p3 e p2 su un valore inferiore a 255. p1 è intrappolato tra 255 e 0.

Il vero problema è che il codice che trasforma questo indirizzo in un indirizzo sposta questi valori. di 24, p2 di 16 e p3 di 8. Comprendendo la limitazione applicata nel metodo di chiamata, è possibile sapere che p1, p2 e p3 non supereranno mai 255, quindi in questo caso sapendo che uno spostamento di 8 o più comporterà 0, nessuno dei singoli elementi dell'indirizzo risulterà in un valore diverso da 0, e l'ultimo ottetto sarà sempre 0, quindi l'indirizzo risultante sarà 0.0.0.0

Se si vuole impedire che venga 0.0.0.0, la prima cosa da fare è rimuovere le operazioni di scorrimento. Ciò manterrà l'ultimo campo come 0, perché non è mai impostato, ma dovrebbe produrre indirizzi.

Ancora una volta, questo non interessa lo stato degli indirizzi, si finirà con gli indirizzi broadcast, multicast e solo locali utilizzando questo metodo.

0

Quando si richiama generateIPAddress(p1, p2, p3), p1 è 255, p2 e p3 sono 0.

Questa linea

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

turni p1 24 bit verso destra. Prima del turno p1 era 11111111. Lo spostamento risulta con 0. In realtà si potrebbe anche usare

int b1 = p1 >> 8; 

come p1 ha solo i suoi 8 bit meno significativi accesi.L'uso di & 0xff è ridondante poiché l'operazione è tra due operandi int. Quindi b1 è 0.

p2 e p3 vengono passati al valore 0 modo che il passaggio (sia 16 o 8) non cambiare un bit, con conseguente b2 e b3 essendo anche 0.

b4 è impostato su 0.

Quindi tutto b1, b2, b3 e b4 sono 0, da cui si crea ip1-ip4. Quindi il metodo generateIPAddress(p1, p2, p3) restituisce sempre 0.0.0.0.

Poi p3 += inc; aggiunge 5-0. Reuslt in p3 ora è 5.

La condizione if (p3 > 255) fallirà sempre come p3 è 5 che è < 255 ...

1

ho recentemente sviluppato un small library in grado di generare gli indirizzi IPv4 casuali utilizzando diversi vincoli tipo:

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); 

uscita :

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

L'ho provato ed è buono! CLASS_A esclude CLASS_A_PRIVATE? –

+0

No, non lo è. È incluso –

+0

Oh, grazie. Quindi non mi sembra di essere sicuro di ottenere un indirizzo che non sia privato –