Допустим, у меня есть два IP-адреса (в .NET класс System.Net.IPAddress). Как я могу перебрать все IP-адреса между двумя заданными адресами?

Например, пусть один адрес будет 192.168.1.1, а другой - 192.168.2.3. Я хочу как-то перебрать все адреса между ними и распечатать их на консоли.

Спасибо.

5
Ove 21 Мар 2010 в 22:54
7
Вам нужна подсеть, чтобы знать, какой адрес между двумя IP-адресами является допустимым.
 – 
OMG Ponies
21 Мар 2010 в 22:57
1
Я не могу придумать очень много «хороших» причин для сканирования сети на предмет действительных IP-адресов, но я могу придумать довольно много гнусных.
 – 
Randolpho
21 Мар 2010 в 22:59
1
- в примере указаны внутренние сетевые адреса, так что вполне может быть "веская" причина.
 – 
ChrisF
21 Мар 2010 в 23:00
1
Я создаю приложение, чтобы отдавать удаленные команды нескольким компьютерам с помощью WMI. Мне нужно имя учетной записи администратора домена и пароль, чтобы делать что-либо с компьютерами. Когда сканирование IP (и даже портов) стало таким преступлением?
 – 
Ove
21 Мар 2010 в 23:11

2 ответа

Лучший ответ

В конце концов я использовал подход, представленный в этом ответе.

Это немного сложнее, но хорошо работает без использования устаревших свойств. Он преобразует IP-адреса в uint, увеличивает их, а затем преобразует обратно.

1
Community 23 Май 2017 в 14:45

Адреса IPv4 - это в основном адреса Int64 с другой нотацией. Итак, вы можете сделать следующее:

for (var i = fromAddress.Address; i <= toAddress.Address; i++)
{
    Console.WriteLine(new IPAddress(i));
}

Свойство Address устарело, но это может вас не беспокоить.

-3
Carvellis 15 Янв 2013 в 21:51
1
Это не работает. Скажем, я хочу увеличить с 192.168.1.1 до 192.168.1.3. fromAddress.Address - 16885952, а toAddress.Address - 50440384. Если я запускаю цикл for, он выводит 192.168.1.1; 193.168.1.1; 194.168.1.1 ... и это продолжается и продолжается.
 – 
Ove
15 Янв 2013 в 23:51
Это просто вызвало бесконечный цикл, в результате которого система остановилась.
 – 
jaseeey
19 Мар 2014 в 10:05
2
Да, это не работает, потому что Windows имеет прямой порядок байтов, а сетевые адреса - прямой порядок байтов.
 – 
Bacon Bits
9 Дек 2017 в 02:43