Как осуществить сканирование портов локальной сети в JAVA?
Возможно ли просканировать порт локальной сети (роутера) любым способом (TCP SYN вероятно простейший) нативными средствами JAVA?
Задача состоит в необходимости сетевого соединения нескольких программ, не зная заранее IP компьютеров. Алгоритм примерно такой - посылаю широковещательное сообщение (по порту UDP по умолчанию например 1234). Остальные слушают этот порт, и, при получении сообщения, коннектятся к полученному IP. Проблема в том, что порт может быть закрыт или недоступен.
Как можно проверить, не зная других IP, что порт открыт? Адрес роутера примем известным. Вероятно, несу ересь, поскольку пока плаваю в теме, или в упор не вижу более простых способов.
1. Открываете какой-либо заранее заданный UDP-порт на прослушивание. (Если проблема в том, что Вы боитесь, что порт будет уже занят каким-то другим сервисом, то заведите пул портов 5-10 в разных частях диапазона).
2. Отправляете широковещательный UDP-пакет на этот порт(ы) с определенной сигнатурой. Если такая сигнатура получена - начинаете обмен. Если какой-то другой сервис занял этот порт, то он просто проигнорирует неизвестную ему сигнатуру.
Широковещательные TCP-запросы невозможны - только UDP.
Если задача установить именно TCP-соединение, то перед широковещательной рассылкой открываете какой-либо свободный TCP-порт на прослушивание, а в UDP-пакете после сигнатуры, указываете, какой номер TCP-порта открыт.
Если боитесь, что TCP-порт на данной машине уже занят каким-то другим сервисом на прослушивание, то процедура listen просто вернет Вам ошибку и Вы выберете следующий свободный.
Идея про посылку в UDP-сообщении порта TCP интересна) Но, все равно, необходимо определить свободный UDP и, желательно, TCP порт. Просто не знаю, каким образом перенести скан портов в JAVA.