Создать случайный IP-адрес - PullRequest
       14

Создать случайный IP-адрес

14 голосов
/ 11 февраля 2012

Я хочу создать случайный IP-адрес. Но всегда эта функция 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 в виде p1,p2,p3, а последний бит должен быть 0.

Ответы [ 6 ]

44 голосов
/ 11 февраля 2012
Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
10 голосов
/ 30 октября 2012

Используя Google Guava :

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

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

1 голос
/ 18 августа 2018

Для генерации случайного IP-адреса с помощью Маска подсети используйте следующий код (обратите внимание, что в этом коде Маска подсети имеет формат CIDR ):

import java.util.Random;
import java.util.Scanner;

public class mainClas {

    public static int findRange(int mask)
    {
        int x = 8 - mask;
        int sum = 0;
        for (int i = 0 ; i < x ; i++) {
            sum += Math.pow(2 , i);
        }
        return sum;
    }

    public static int findFixedPart(String IPPrefix, int i)
    {
        String f = IPPrefix.split("\\.")[i];
        return Integer.valueOf(f);
    }

    public static String generateRandomIP(String IPPrefix, Integer mask)
    {
        String IP="";
        Random r = new Random();
        if (mask < 8)
            IP = (findFixedPart(IPPrefix, 0) + r.nextInt(findRange(mask))) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
        else if (mask >7 && mask < 16)
            IP = findFixedPart(IPPrefix, 0) + "." + (findFixedPart(IPPrefix, 1) + r.nextInt(findRange(mask-8))) + "." + r.nextInt(256) + "." + r.nextInt(256);
        else if (mask >15 && mask < 24)
            IP = findFixedPart(IPPrefix, 0) + "." + findFixedPart(IPPrefix, 1)  + "." + (findFixedPart(IPPrefix, 2) + r.nextInt(findRange(mask-16))) + "." + r.nextInt(256);
        else if (mask >23 && mask < 33)
            IP = findFixedPart(IPPrefix, 0) + "." + findFixedPart(IPPrefix, 1)  + "." + findFixedPart(IPPrefix, 2) + "." + (findFixedPart(IPPrefix, 3) + r.nextInt(findRange(mask-24)));
        return IP;
    }

    public static void main(String[] inpout)
    {

        System.out.println("Enter IP Prefix: ");
        Scanner sc = new Scanner(System.in);
        String IPPrefix = sc.nextLine();
        System.out.println("Enter Mask: ");
        Integer mask = sc.nextInt();

        // Find random IP in Subnet mask
        String IP = generateRandomIP(IPPrefix, mask);
        System.out.println(IP);
    }
}
1 голос
/ 05 марта 2017

Недавно я разработал небольшую библиотеку , которая может генерировать случайные адреса 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 голосов
/ 17 июля 2013

Когда вы вызываете generateIPAddress(p1, p2, p3), p1 равно 255, p2 и p3 равны 0.

Эта строка

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

shift 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 ...

0 голосов
/ 17 июля 2013

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

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

...