Соответствие IP-адресу к таблице масок подсети …, Каков лучший подход в Java?

Вот сценарий... У меня есть таблица подсетей. (см. ниже), у меня есть IP-адрес. Я хотел бы узнать, какой подсети IP-адрес принадлежит на основе поиска в таблице. Эта ассоциация будет тогда использоваться для определения, в каком местоположении пользователь. Это - пространство частной сети, таким образом, стандартный Интернет к поискам местоположения не применялся бы. Каков был бы лучший подход? Я должен был бы повредить IP-адрес в, он - числовые части и к поразрядному сравнению со всеми подсетями.. или есть ли встроенные инструменты в API Java, который мог сделать мою жизнь легче для сравнения IP-адреса к маске подсети?

Я главным образом ищу лучший способ сравнить ipaddress с данной подсетевой маской и определяю да, это соответствует, или не это не делает.. Дополнительно. Любые подсказки относительно того, как сохранить список и поиск с минимальными операциями, ценились бы также.

Идеально я сделал бы что-то подобное этому:

List subnetInfo = null;

subnetInfo = findSubnet('192.168.0.1');  //value null if nothing found

....

//return null if nothing found
List findSubnet(String ipaddress) {
   List subnetDetails = null;
   .... code here ...
   return subnetDetails;
}

Таблица 1: Демонстрационный список подсетей

dk-ballerup-gen-off-v411        10.172.80.0/21  NANR-denmark-ballerup-metallbuen66-ground-first-floors-incl-dhcp-(sr14585203)
ae-dubai-ofssl-gen-off-v410  10.172.88.0/24  NANR-arab-emirates-ofssl-iflex-general-office-v410-(sr12781477)
ru-stpetersburg-gen-off-v411    10.172.89.0/24  NANR-russia-stpetersburg-general-office-incl-dhcp (bsteinba)
10
задан skaffman 16 February 2010 в 23:27
поделиться

4 ответа

В Apache Commons Net есть SubnetUtils для подобных вещей, включая определение того, находится ли данный IP-адрес в пределах данной подсети.

Тривиальный пример:

    String[] subnetsMasks = { ... };
    Collection<SubnetInfo> subnets = new ArrayList<SubnetInfo>();
    for (String subnetMask : subnetsMasks) {
        subnets.add(new SubnetUtils(subnetMask).getInfo());
    }

    String ipAddress = ...;
    for (SubnetInfo subnet : subnets) {
        if (subnet.isInRange(ipAddress)) {
            System.out.println("IP Address " + ipAddress + " is in range " + subnet.getCidrSignature());
        }
    }
3
ответ дан 4 December 2019 в 04:21
поделиться

Помните, что IP-адрес - это просто значение int по историческим причинам, представленное как 4 октета в десятичной форме.

Для одного и того же токена подсеть представляет собой диапазон последовательных целых чисел от сетевого адреса до широковещательного адреса.

Следовательно, если ваш объект IP-адреса имеет преобразователь int, вы можете просто проверить, находится ли это целое число в диапазоне подсети, выполнив простые сравнения int.

3
ответ дан 4 December 2019 в 04:21
поделиться

Если ваша таблица является таблицей SQL И ваша база данных - PostgreSql, вы можете использовать PostgreSQL типы и функции .

Ну, это много условий ...

0
ответ дан 4 December 2019 в 04:21
поделиться

Превратите IP-адрес и сетевую маску в целые числа и И их вместе. Если результат равен IP-адресу, это адрес в этой сетевой маске. Обратите внимание, что вы можете получить более одного совпадения, если ваши маски сети не различимы.

0
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: