Сканирование портов внешнего хоста

Я пишу сканер портов в 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);

Отдельная причина в том, что время истекло. Это связано с тем, что ваша машина, вероятно, находится за каким-то видом брандмауэра и не связана с вашим примером кода.

Другие вопросы по тегам