как я могу идентифицировать машины в домашней сети, используя Java - PullRequest
0 голосов
/ 05 июня 2011

Я пытаюсь написать программу на Java, чтобы найти адрес любых машин, подключенных к моей домашней сети.Моя первая идея - просмотреть каждый адрес в диапазоне 192.168.1. [0-254] и проверить, есть ли в сети компьютер с таким адресом, но я не могу найти простой способ проверить, является ли данный адресесть машина с таким адресом.Я думаю, я мог бы попытаться открыть сокет на каждом возможном порту и сделать вывод, что если все они выходят из строя, то нет машины, но на первый взгляд кажется, что это занимает слишком много времени, когда нет машины (проверка заняла более минутытолько 2 порта на адрес без подключенной машины).

Существует ли быстрый и простой способ проверить, есть ли машина с данным адресом?Есть ли лучший способ сделать это в Java, кроме просто попробовать каждый адрес?

Заранее спасибо за любую помощь

Ответы [ 3 ]

1 голос
/ 05 июня 2011

Если вы просто хотите узнать, какие IP-адреса в вашей сети используются, просто используйте nmap .

Если вы хотите узнать, как сделать это для себя, я мог бы предложить сначала выполнить работу на C. Все API сокетов написаны на C, и это, пожалуй, самая естественная среда для работы. с розетками. (Плюс, Иллюстрированный TCP / IP использует C, поэтому примеры легче найти.)

Тем не менее, - примеры Java, использующие ICMP ; все они будут использовать jnetpcap или Jpcap , обертки вокруг libpcap (базовая библиотека C).

Если вы хотите выполнить сканирование портов, вы можете воспользоваться несколькими подходами:

  • Вы можете создать многопоточное приложение: создать пул потоков из 100 или 200 потоков и отправить «задания» для попытки connect() каждой паре (IP, Port), которая может быть открыта. Поскольку для каждого IP-адреса предусмотрено 65 тыс. Портов, а время ожидания соединения может быть довольно продолжительным (если ваш код не получает отклик RST или хост ICMP или порт недоступен), это может быть очень медленным и, возможно, очень большим объемом памяти. Вы можете установить будильник в каждом потоке, если соединение не будет установлено в течение трех или пяти секунд ...

  • Вы можете переключиться на более низкий уровень и использовать libpcap или аналогичные инструменты для отправки попыток подключения, сделанных вручную, и отмечать только ответы (и не пытайтесь настроить соединения). Это один из подходов, принятых nmap, и одна из причин, по которой он дает ответы намного быстрее, чем ваше приложение.

0 голосов
/ 05 июля 2011

Вы можете использовать InetAddress.isReachable(int timeout), так как это отправляет ICMP PING, но есть несколько вариантов получения разрешения, использующих это ( поиск SO для справки с подробностями).

Вы также можете отправлять UDP-пакеты, используя DatagramSocket и искать PortUnreachableException с. Если вы отправляете их на порт 7 (эхо), вы должны либо получить исключение, либо те же данные, которые вы отправили в ответ. Этот метод также имеет некоторые недостатки, поскольку он требует, чтобы все узлы в сети отправляли ответ, когда он получает пакет UDP на порт, который он не прослушивает. Обычно так и есть, но брандмауэры могут его отфильтровать.

Самый простой способ - просто запустить команду ping.

0 голосов
/ 05 июня 2011

Вы можете попробовать выполнить команду ping с помощью Runtime.exec или разработать клиент ping в самой java.Использование ping избавит вас от необходимости проверять каждый порт.

...