Я надеюсь, что вы имеете в виду следующее:
"Я хочу обнаружить все системы в той же локальной сети, что и (компьютер, на котором выполняется моя программа), основной IP-адрес, который прослушивается.определенный порт TCP. "
С UDP это немного более сложная проблема - вы можете искать отказы, но ваш пакет может быть съеден или потерян (как и ответ).
ТеперьПредполагая, что у вас TCP, у вас есть три шага.
- Получите IP-адрес локального интерфейса, который вы считаете «основным».
- Перечислите хосты в той же подсети, что и этот адрес.
- Для каждого хоста определите, прослушивает ли соответствующий порт.
Для шага 1 используйте InetAddress.getLocalHost()
.
Для шага 2 получите подсетьчасть полученного адреса, а затем попробуйте все возможные узлы в этой подсети.Будем надеяться, что это класс C, и там всего 254 хоста. Нет 100% уверенного способа получить все хосты, не пробуя каждый из них .Не определенный на 100% (и более сложный) способ состоит в том, чтобы использовать таблицы ARP, чтобы получить представление маршрутизатора о сети, отправлять широковещательный пинг в локальную сеть или переходить на уровень 2 и отправлять широковещательный Ethernet-пакет..
На шаге 3 откройте соединение с каждым хостом на соответствующем порту, а затем закройте его.Если время ожидания истекло или отказано, поцарапайте хост.В противном случае добавьте его в список «прослушивания».Возможно, вы захотите попробовать более одного соединения за раз и установить интервал тайм-аута на что-то небольшое, так как большинство людей не будут слушать.
Шаг 4: поздравляем!Вы только что сделали очень ненадежную версию nmap
на Java.