Вот сценарий... У меня есть таблица подсетей. (см. ниже), у меня есть 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)
В 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());
}
}
Помните, что IP-адрес - это просто значение int
по историческим причинам, представленное как 4 октета в десятичной форме.
Для одного и того же токена подсеть представляет собой диапазон последовательных целых чисел
от сетевого адреса до широковещательного адреса.
Следовательно, если ваш объект IP-адреса имеет преобразователь int, вы можете просто проверить, находится ли это целое число в диапазоне подсети, выполнив простые сравнения int.
Если ваша таблица является таблицей SQL И ваша база данных - PostgreSql, вы можете использовать PostgreSQL типы и функции .
Ну, это много условий ...
Превратите IP-адрес и сетевую маску в целые числа и И их вместе. Если результат равен IP-адресу, это адрес в этой сетевой маске. Обратите внимание, что вы можете получить более одного совпадения, если ваши маски сети не различимы.