Генерация всех IP-адресов в диапазоне IPv4 - PullRequest
3 голосов
/ 07 января 2010

Каким будет эффективный способ создания всех возможных адресов IP v4? кроме итерации всех байтов в одном гиганте, вложенном в цикл.

Ответы [ 5 ]

10 голосов
/ 07 января 2010

Редактировать : Мой предыдущий ответ изменился бы с 128.0.0.0 до 255.255.255.255 до 0.0.0.0 до 127.255.255.255. Предположительно, вы хотите перейти от 0.0.0.0 к 255.255.255.255, поэтому я отредактировал свое решение для этого.

int i = -1;
do {
  i++;

  int b1 = (i >> 24) & 0xff;
  int b2 = (i >> 16) & 0xff;
  int b3 = (i >>  8) & 0xff;
  int b4 = (i      ) & 0xff;

  //Now the IP is b1.b2.b3.b4

} while(i != -1);

Примечание: если вы не уверены, как закончится этот цикл (то есть, как добавление от 1 до -1 достаточного количества раз делает его снова -1), прочитайте дополнение к двум . По сути, добавление единицы к Integer.MAX_VALUE приводит к Integer.MIN_VALUE и не вызывает каких-либо исключений.


Старый ответ . По-прежнему попадает на все IP-адреса, но, вероятно, не в том порядке, в котором вы хотите:

for(long n = Integer.MIN_VALUE; n <= Integer.MAX_VALUE; n++)
{
  int i = (int)n;

  int b1 = (i >> 24) & 0xff;
  int b2 = (i >> 16) & 0xff;
  int b3 = (i >>  8) & 0xff;
  int b4 = (i      ) & 0xff;

  //Now the IP is b1.b2.b3.b4
}

Обратите внимание: если переменная управления циклом была int вместо long, это был бы бесконечный цикл (поскольку все int s всегда <= Integer.MAX_VALUE).

3 голосов
/ 07 января 2010

Не все адреса IPv4 являются действительными, в зависимости от того, для чего они предназначены. См. Раздел о зарезервированных адресных блоках и связанных RFC здесь: http://en.wikipedia.org/wiki/IPv4

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

2 голосов
/ 07 января 2010

все возможно? От 0.0.0.0 до 255.255.255.255, от 0 до 0xFFFFFFFF

1 голос
/ 07 января 2010

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

Обратите внимание на две вещи: 1. Есть много адресов, так что это не будет так эффективно. 2. Не все IP-адреса являются действительными (и существует множество адресов, которые вы, вероятно, не собираетесь использовать).

В качестве примера того, какие IP-адреса являются действительными, обратите внимание, что все адреса между 224.0.0.0 и 239.255.255.255 являются адресами многоадресной рассылки, все адреса, начинающиеся с 127.x.x.x, являются недействительными и т. Д.

1 голос
/ 07 января 2010

Вы можете начать с беззнакового типа int / long (32-битный тип данных), инициализированного нулем, и продолжать увеличивать до достижения 0xffffffff.

Оператор приращения обычно немного более эффективен, чем вложенные циклы.

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

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