Сканирование портов внешнего хоста
Я пишу сканер портов в Java в качестве учебного упражнения, и я столкнулся с проблемой. Моя программа работает нормально, когда я сканирую порты на моей локальной машине, однако, когда я пытаюсь сканировать порты на чужих компьютерах, процесс просто зависает. Вот код для моего метода сканирования:
public void scan(InetAddress ad, int start, int end){
for(int i=start; i<=end; i++){
try{
socket = new Socket(ad, i);
System.out.println("Port "+i+"is open");
}catch(Exception e){
System.out.println("Port "+i+"is not open");
}
}
}
Пока это работает, когда имя хоста является моим адресом обратной связи или просто "localhost", оно даже работает с моим IP-адресом. Но когда я, например, определю IP-адрес для www.google.com или даже дам ему IP-адрес другого моего компьютера в той же сети, программа остановится после сканирования первого порта.
Я разрешаю IP-адрес следующим образом:
inetAddressObject = InetAddress.getByName(hostNameString);
Может кто-нибудь сказать мне, если я пропускаю большую разницу между сканированием портов на локальном компьютере и сканированием портов на стороннем хосте? Или что-то не так с моим кодом?
1 ответ
Как вы вызываете конструктор Socket, соединение будет установлено сразу. Проблема заключается в том, что если время соединения истекло, вам придется подождать некоторое время (ОС по умолчанию). Вот как вы должны это сделать:
Socket s = new Socket();
s.connect(new InetSocketAddress(ad, i), timeout);
Отдельная причина в том, что время истекло. Это связано с тем, что ваша машина, вероятно, находится за каким-то видом брандмауэра и не связана с вашим примером кода.