Как получить все имена систем, подключенных к локальной сети с помощью Java? - PullRequest
3 голосов
/ 24 октября 2009

Я хочу подключить все системы в локальной сети? Кто-нибудь может мне подсказать?

Ответы [ 3 ]

2 голосов
/ 24 октября 2009

Пакет, который я использовал в Java для этого, назывался jcifs. Вот ссылка на библиотеку .

Обратите внимание, что для идентификации машины в подсети вам необходимо пропинговать все доступные IP-адреса в подсети. Оттуда вы можете выполнить обратный поиск IP-адреса, чтобы получить подробную информацию о машинах.

Из памяти OSI причина, по которой вы хотите пропинговать все машины в сети, заключается в том, что ICMP по-прежнему является самым низким уровнем в модели OSI. Хотя вы просто не можете доверять, просто используя запросы ICMP (ping) ко всем машинам в подсети. Причиной этого является то, что большинство компьютеров Windows для предотвращения атак с использованием фишинга блокирует этот протокол. Поэтому вместо этого вам нужно использовать двухэтапный подход к обнаружению. Во-первых, широковещательная передача по IP-адресу подсети с помощью запроса проверки связи ICMP. От запроса проверки связи ICMP после ожидания в течение 1 секунды перейдите к выполнению SMB-соединения с неотвечающими IP-адресами. Вы обнаружите, что у большинства людей есть общий принтер Microsoft Network, который будет отвечать на запрос через этот порт.

Альтернативой является использование обратного поиска имени NetBios, хотя он все еще включает в себя рассылку спама в диапазоне IP-адресов подсети.

Надеюсь, это поможет.

0 голосов
/ 24 октября 2009

Если бы я собирался реализовать это на Java, я бы выбрал какой-нибудь неиспользуемый номер порта TCP / IP, а затем попытался открыть сокет для каждого IP-адреса в диапазоне (-ах) IP-адреса локальной сети. Вы ожидаете, что все попытки соединения потерпят неудачу, но они должны потерпеть неудачу различными способами в зависимости от того, использует ли машина IP-адрес. Если используется IP-адрес, вы должны получить «отказано в соединении». Если он не используется, вы должны получить «нет маршрута к хосту» или «нет маршрута к сети». «Тайм-аут соединения» может указывать на то, что хост имеет огненную стену или недавно был жив, но в данный момент не жив.

Другой подход (который я не знаю, вы можете сделать из Java) - это отправлять запросы ARP для каждого из IP-адресов в диапазоне сетевых адресов и смотреть, что происходит в ARP-кэше вашей машины.

И, конечно, вы можете попробовать отправить сообщения ICMP Ping, но они могут быть защищены брандмауэром.

Получив список действующих IP-адресов, воспользуйтесь обратным поиском DNS, чтобы найти соответствующие имена DNS. Но учтите, что не все IP-адреса связаны с DNS-именами.

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

0 голосов
/ 24 октября 2009

Почему вы хотите их, и почему они должны быть именами? Не у всех систем есть имя.

Какие системы вы пытаетесь перечислить?

Если вы пытаетесь найти близлежащие экземпляры своего собственного приложения, используйте многоадресный UDP для создания протокола обнаружения.

Если вы пытаетесь найти какой-либо сервер, у которого есть собственный протокол для этой цели, используйте его.

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