2012-01-22 1 views
1

Я хочу найти все системы, которые находятся в той же локальной сети, то есть имеют ту же маску подсети.Как получить все IP-адреса подсети, которые выполняются на определенном порту

Я думаю, что должен работать с InetAddress Класс на Java, но я не знаю, что мне делать. Мой алгоритм:

  1. Найти все доступные системы в локальной сети

  2. Проверьте, если они работают на моем запрошенный порт

  3. Имейте в виду IP-системы, которая работает на этом порту

InetAddress localHost = Inet4Address.getLocalHost(); 
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 
System.out.println(networkInterface); 
networkInterface.getByInetAddress(localHost); 

for(){ 
    networkInterface.getByInetAddress(localHost) 
} 

Я думаю, что networkInterface.getByInetAddress(localHost) может предоставить мне все доступные IP-адреса в подсети, но я не могу это сделать для всех доступных систем и каково условие для статьи for.

+1

getbyInetAddress возвращает сетевой интерфейс на вашем компьютере, привязанный к указанному сетевому адресу. он не сообщает вам, какие адреса используются в других местах локальной сети. Ничто из того, что вы можете сделать локально, скажет вам, какие IP-адреса используются. Для этого вам нужно исследовать таблицы маршрутизаторов/arp. –

ответ

4

Найти все возможно IP-адреса в подсети IP просты. Просто напишите цикл, который перечисляет все возможные byte[] представления в подсети и создает для них InetAddress экземпляров.

Это легкий бит, жесткий бит решить эти две проблемы:

  • как вы найдете все, если живые IP-адреса в подсети, и

  • для данного IP-адрес, как вы определяете, использует ли он конкретный порт.

Первая проблема может быть решена двумя способами:

  • Вы можете использовать метод InetAddress.isAlive(), чтобы увидеть, если хост отвечает на пинг. Проблема в том, что некоторые хосты могут быть настроены так, чтобы не отвечать на пинги, или блокировки могут быть заблокированы внутренним брандмауэром. Это также не работает, если подсеть большая. Проблема в том, что вам нужно выполнить ping большое количество хостов, и это займет много времени и сгенерирует много сетевого трафика ... особенно если это несколько экземпляров приложений.

  • Более разумной альтернативой является проверка кеша ARP локальной сети и извлечение всех IP-адресов, о которых он знает. Проблема в том, что 1) ваше приложение может не иметь прав доступа для доступа к кешу ARP, 2) некоторые IP-адреса могут отсутствовать в кеше, а 3) нет доступа к кэшу ARP в чистой Java.

Вторая проблема зависит от характера услуги на порт:

  • Если это сервис TCP на основе, то вы можете попытаться подключиться к IP/порт с помощью простой разъем.Если соединение принято, порт используется чем-то. Это может быть или не быть услугой, которую вы ожидаете, но, в общем, единственный способ сказать, что это попытаться использовать , использовать услугу.

  • Если это служба на основе UDP, то есть now way, чтобы узнать, что-то использует порт.

+0

Поиск всех возможных IP-адресов в подсети IP-адресов прост. Просто напишите цикл, который перечисляет все возможные байтовые [] представления в подсети и строит экземпляры InetAddress для них .... моя проблема именно в этих предложениях, как я могу реализовать этот цикл и какой метод я могу использовать? – hirad

+0

Извините, но я не хочу писать код для вас. Достаточно сказать, что это относительно простая задача, которую может сделать любой человек с опытом работы в течение нескольких месяцев Java. Я не знаю ни одной существующей библиотеки Java, которая бы это сделала. (Возможно, проще написать код самостоятельно, чем искать библиотеку.) –

+0

, если проще написать и не приходить сюда и спрашивать !!! – hirad

0

Я буду надеяться, что вы имеете в виду следующее:

«Я хочу, чтобы обнаружить все системы на одной и той же локальной сети, (на компьютере под управлением моей программы) 's первичный IP-адрес, которые являются прослушивание определенного TCP-порта ».

С UDP это немного сложнее - вы можете искать отскоки, но ваш пакет может быть съеден или потерян (как и ответ).

Теперь, принимая TCP, у вас есть три шага.

  1. Получите IP-адрес локального интерфейса, который, по вашему мнению, является «основным».
  2. Перечислить узлы в той же подсети, что и этот адрес.
  3. Для каждого хоста определите, прослушивает ли соответствующий порт.

Для этапа 1 используйте InetAddress.getLocalHost().

Для шага 2 найдите часть подсети восстановленного адреса и затем попробуйте все возможные хосты в этой подсети. Будем надеяться, что это класс C, и есть только 254 хоста. Нет 100% уверенного способа получить все хосты, не пробовав каждый. Не-100% -ный (и более сложный) способ заключается в использовании таблиц ARP для получения представления маршрутизатора о сети, отправки широковещательного пинга в локальную сеть или падения до уровня 2 и отправки широковещательного Ethernet-пакета ,

Для шага 3 откройте соединение с каждым хостом на соответствующем порту, а затем закройте его. Если время соединения отключено или отклонено, поцарапайте хост. В противном случае добавьте его в список «прослушивание». Возможно, вы захотите попробовать несколько подключений одновременно и установить интервал времени ожидания на что-то маленькое, так как большинство людей не будет слушать.

Шаг 4: поздравляем! Вы только что создали очень функциональную версию nmap в Java.

+0

спасибо большое, но как я могу реализовать шаг 2 в java ??? я не имел никакой идеи – hirad

+0

@hirad: IP-адрес делится на две части: «сетевая маска» и «маска хозяина». Вы сохраняете маску сети и пробуйте все возможные хосты. Итак, «192.168.1.56/24» означает «192.168.1.XXX» для всех возможных XXX с 001 по 254. – Borealid

+0

не является какой-либо java-библиотекой, которая это делает ??? – hirad