Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 1
Регистрация: 19.09.2018
Сообщений: 59

Перебор IP адресов между двумя адресами

16.07.2019, 08:01. Показов 2734. Ответов 15

Студворк — интернет-сервис помощи студентам
Привет. Не подскажете, как написать перебор IP адресов между двумя адресами. На входе числа a1,b1,c1 и d1 (от 0 до 255) для начального адреса и a2,b2,c2 и d2 для конечного адреса, а на выходе надо получить список IP адресов между этими двумя адресами.
Гуглил, но нашёл примерно только такой вариант (см. ниже). Но он неверный, куча адресов пропускается, а если допустим c1 будет больше c2, то вообще ничего не выведется, ведь этот цикл в обратную сторону не пойдёт.
C++
1
2
3
4
5
6
7
for (int a = a1; a <= a2; a++)
        for (int b = b1; b <= b2; b++)
            for (int c = c1; c <= c2; c++)
                for (int d = d1; d <= d2; d++)
                {
                    cout << a << "." << b << "." << c << "." << d << endl;
                }
Пробовал писать (см. ниже), но это только для изменений двух последних блоков c и d. Если продолжать в том же духе, то будет просто куча повторяющегося кода. Может, знает кто-нибудь, как лучше?
C++
1
2
3
4
5
6
7
8
9
for (d = d1; d < 256; d++)
        { cout << a << "." << b << "." << c << "." << d << endl; }
    
    for (c = c1+1; c < c2; c++) 
        for (d = 0; d < 256; d++)
            { cout << a << "." << b << "." << c << "." << d << endl; }
    
    for (d = 0; d <= d2; d++)
    { cout << a << "." << b << "." << c << "." << d << endl; }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2019, 08:01
Ответы с готовыми решениями:

Реализовать перебор всех возможных IP-адресов (С++)
Реализовать перебор всех возможных IP-адресов, начиная с 0.0.0.0, заканчивая 255.255.255.0. (проще говоря перебор всех возможных комбинаций...

Разница байт между адресами переменных
Добрый день, форумчане. Изучаю работу с памятью в С++ через указатели. Я узнал, что существует стековая память, и сам стек организован по...

Реально ли измерить расстояние между двумя IP-адресами?
Доброго времени суток! Меня давно уже интересует один вопрос. А реально ли измерить расстояние (в км) между двумя IP-адресами в пределах...

15
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
16.07.2019, 08:26
IP-адрес - это обычное четырехбайтное число (если о IPv4 говорим). Все эти "255." - это чтобы человечкам было удобнее, решили так записывать - значение каждого байтика через точечку. А значит, чтобы перебрать все адреса между заданными, нужно из компонент начального и конечного IP-адресов создать два четырехбайтных числа и перебрать всё, что между этими числами.

Добавлено через 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//g++  5.4.0
 
#include <iostream>
#include <cstddef>
    
#define MAKEIP(a, b, c, d) (((a) << 24) | (((b) & 0xff) << 16) | (((c) & 0xff) << 8) | ((d) & 0xff))
 
#define GETA(ip) (((ip) >> 24) & 0xff)
#define GETB(ip) (((ip) >> 16) & 0xff)
#define GETC(ip) (((ip) >> 8) & 0xff)
#define GETD(ip) ((ip) & 0xff)
 
int main()
{
    uint32_t a1, b1, c1, d1;
    uint32_t a2, b2, c2, d2;
    std::cin >> a1 >> b1 >> c1 >> d1;
    std::cin >> a2 >> b2 >> c2 >> d2;
    
    uint32_t begin = MAKEIP(a1, b1, c1, d1);
    uint32_t end = MAKEIP(a2, b2, c2, d2);
    
    if (begin > end) {
        std::swap(begin, end);
    }
    
    for (uint32_t ip = begin; ip <= end; ++ip) {
        std::cout << GETA(ip) << "." << GETB(ip) << "." << GETC(ip) << "." << GETD(ip) << "\n";
    }
}
https://rextester.com/LFQ31046

P.S. Код учитывает не все случаи.
0
1 / 1 / 1
Регистрация: 19.09.2018
Сообщений: 59
16.07.2019, 12:52  [ТС]
Знаю, что ваш способ умнее, но не подскажете как это сделать через вложенные циклы, как я пытался раньше? то есть проходим по блоку d, который вложен в c, с в свою очередь вложен в b и т.д.
0
Злостный нарушитель
 Аватар для Verevkin
10860 / 5805 / 1282
Регистрация: 12.03.2015
Сообщений: 26,811
16.07.2019, 13:48
Цитата Сообщение от XSasha Посмотреть сообщение
но не подскажете как это сделать через вложенные циклы, как я пытался раньше? то есть проходим по блоку d, который вложен в c, с в свою очередь вложен в b и т.д.
Извращенец детектед.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
typedef union
{
  uint32_t dwFull;
  uint8_t  bytes[4];
}
TIP;
 
inline void swap_sort8(uint8_t &a, uint8_t &b) 
{ 
  if (a <= b) return;
  a ^= b; b ^= a; a ^= b; 
}
 
unsigned list_ip(uint8_t a1, uint8_t a2, uint8_t b1, uint8_t b2,
                 uint8_t c1, uint8_t c2, uint8_t d1, uint8_t d2)
{
  swap_sort8(a1, a2);
  swap_sort8(b1, b2);
  swap_sort8(c1, c2);
  swap_sort8(d1, d2);
  
  TIP ip;
  unsigned count = 0;
  unsigned total = (1 + d2 - d1) * (1 + c2 - c1) * (1 + b2 - b1) * (1 + a2 - a1);
  
  printf(" # Всего IP-адресов: %u\n\n", total);
 
  for (ip.bytes[3] = a1; ip.bytes[3] <= a2; ip.bytes[3]++)
    for (ip.bytes[2] = b1; ip.bytes[2] <= b2; ip.bytes[2]++)
      for (ip.bytes[1] = c1; ip.bytes[1] <= c2; ip.bytes[1]++)
        for (ip.bytes[0] = d1; ip.bytes[0] <= d2; ip.bytes[0]++)    
          printf("%8u ---> %d.%d.%d.%d (0x%08X)\n", 
                 ++count, 
                 ip.bytes[3], ip.bytes[2], ip.bytes[1], ip.bytes[0], 
                 ip.dwFull); 
     
  return count;      
}
0
1 / 1 / 1
Регистрация: 19.09.2018
Сообщений: 59
16.07.2019, 14:58  [ТС]
Протестируй 1.1.1.1 и 1.1.2.1 - сломается
0
Злостный нарушитель
 Аватар для Verevkin
10860 / 5805 / 1282
Регистрация: 12.03.2015
Сообщений: 26,811
16.07.2019, 15:17
Цитата Сообщение от XSasha Посмотреть сообщение
Протестируй 1.1.1.1 и 1.1.2.1 - сломается
Ты это мне?
Не сломалось почему-то.

0
1 / 1 / 1
Регистрация: 19.09.2018
Сообщений: 59
16.07.2019, 15:23  [ТС]
А должно вывести 257 адресов. Ты знаешь что такое IP?
0
Злостный нарушитель
 Аватар для Verevkin
10860 / 5805 / 1282
Регистрация: 12.03.2015
Сообщений: 26,811
16.07.2019, 15:26
Цитата Сообщение от XSasha Посмотреть сообщение
А должно вывести 257 адресов.
По условию задачи должно было вывести именно 2 адреса, т.к. изменяется только 1-й байт 4-байтного числа (от 1 до 2), а остальные байты остаются неизменными и равны 1.
0
Модератор
4149 / 2360 / 812
Регистрация: 15.11.2015
Сообщений: 9,461
16.07.2019, 16:42
Цитата Сообщение от XSasha Посмотреть сообщение
как это сделать через вложенные циклы, как я пытался раньше?
Если так хочется извратиться, то в голову приходит проверять, если значение переменной цикла A является начальным (A = A1), то вложенный цикл B начинается с B1, иначе, с 0. И так далее с B, C и D.
0
Злостный нарушитель
 Аватар для Verevkin
10860 / 5805 / 1282
Регистрация: 12.03.2015
Сообщений: 26,811
16.07.2019, 16:45
Цитата Сообщение от AzAtom Посмотреть сообщение
Если так хочется извратиться, то в голову приходит проверять, если значение переменной цикла A является начальным (A = A1), то вложенный цикл B начинается с B1, иначе, с 0. И так далее с B, C и D.
Но это ж чистейший говнокод!
0
Модератор
4149 / 2360 / 812
Регистрация: 15.11.2015
Сообщений: 9,461
16.07.2019, 16:47
Verevkin, а мы не ищем лёгких путей.
0
Злостный нарушитель
 Аватар для Verevkin
10860 / 5805 / 1282
Регистрация: 12.03.2015
Сообщений: 26,811
16.07.2019, 17:05
Цитата Сообщение от AzAtom Посмотреть сообщение
а мы не ищем лёгких путей.
Не надо заниматься онанизмом на сайтах по практическому программированию. Для этих целей есть порнхаб.
Иначе вырастают криворукие индусы-говнокодеры, а потом у нас ракеты падают и подводные лодки тонут.

Не надо так. Программисты - не врачи, но и от их работы зависят человеческие жизни.
0
1 / 1 / 1
Регистрация: 19.09.2018
Сообщений: 59
16.07.2019, 17:44  [ТС]
Verevkin, говнокод писать не собираюсь, я сюда далеко не за этим пишу. Была мысль про эти самые пресловутые вложенные циклы, но от неё отказался, а ты уж поднял шум про ракеты и подводные лодки. Ты мне скинул код, который не полностью перебирает адреса между двумя границами, сам потести. Ссориться ни с кем не собираюсь.

Добавлено через 7 минут
Мы не поняли друг друга в общем
0
Злостный нарушитель
 Аватар для Verevkin
10860 / 5805 / 1282
Регистрация: 12.03.2015
Сообщений: 26,811
16.07.2019, 17:46
Цитата Сообщение от XSasha Посмотреть сообщение
Мы не поняли друг друга в общем
Не за что. Заходи ещё.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
16.07.2019, 21:07
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <sstream>
using namespace std;
 
void f(char *str,int &a,int &b, int &c, int &d){
 
 stringstream s;
 size_t i=0;
 
 while(str[i]!='\0'){
   if(str[i]!='.')s<<str[i];
   if(str[i]=='.')s<<' ';
   i++;
 }
  s>>a;
  s>>b;
  s>>c;
  s>>d;
}
 
int main()
{
  int a1,b1,c1,d1,a2,b2,c2,d2;
  char ip_begin[]="1.1.1.1";
  char ip_end[]="1.1.2.1";
 
  f(ip_begin,a1,b1,c1,d1);
  f(ip_end,a2,b2,c2,d2);
  while(1){
      cout<<a1<<"."<<b1<<"."<<c1<<"."<<d1<<"\n";
      if((a1==a2) && (b1==b2) && (c1==c2) && (d1==d2))break;
      d1++;
      if(d1==256){c1++; d1=0;}
      if(c1==256){b1++; c1=0; d1=0;}
      if(b1==256){a1++;b1=0;c1=0;d1=0;}
      if(a1==256)break;
 }
 
system("pause");
return 0;
}
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
17.07.2019, 00:54
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <arpa/inet.h>
 
int main() {
    const char * first = "192.168.0.252";
    const char * last = "192.168.1.10";
    uint32_t start = ntohl(inet_addr(first));
    uint32_t stop = ntohl(inet_addr(last));
 
    for ( uint32_t i = start + 1; i < stop; ++i ) {
        struct in_addr sa = { .s_addr = htonl(i) };
        std::cout << inet_ntoa(sa) << std::endl;
    }
 
    return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[andrew@easybook other]$ g++ -Wall hosts_between.cpp 
[andrew@easybook other]$ ./a.out 
192.168.0.253
192.168.0.254
192.168.0.255
192.168.1.0
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
[andrew@easybook other]$
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2019, 00:54
Помогаю со студенческими работами здесь

Какие из приведённых адресов могут являться адресами конечных узлов сети
Какие из приведённых адресов могут являться адресами конечных узлов сети Выберите один или несколько ответов: 106.0.0.1 127.0.0.1 ...

Перебор IP адресов
Всем привет, подскажите как сгенерировать список IP адресов к примеру от 192.168.0.0 до 192.170.0.0

Перебор диапазона IP адресов
В общем вроде бы тривиальная задача, получить список IP-адресов из заданного диапазона. Но решить её никак не получается. Перерыл весь...

Найти кратчайшее расстояние между двумя вершинами в графе. Найти все возможные пути между этими двумя вершинам
Найти кратчайшее расстояние между двумя вершинами в графе. Найти все возможные пути между этими двумя вершинами в графе, не...

Как осуществить перебор айпи адресов в скрипте?
Всем привет, это опять я...Опять у меня вопрос.Есть вот такой скрипт proba.php : &lt;?php $ip = &quot;85.37.154.8&quot;; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru