в Java, как добиться сканирования портов UDP? - PullRequest
5 голосов
/ 03 мая 2011

новинка здесь, я работаю над программой для сканирования портов, TCP работает хорошо, но я не знаю, как добиться сканирования портов UDP. Скажем, я хочу знать, открыт ли UDP-порт XXXX на другом хосте в этой локальной сети. этот код будет работать? если нет, то в чем проблема?

protected String scanUDP(InetAddress IP, int port)
{
    try{
        byte [] bytes = new byte[128];
        DatagramSocket ds = new DatagramSocket();
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, IP, port);
        ds.setSoTimeout(1000);
        ds.send(dp);
        dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);
        ds.close();
    }
    catch(InterruptedIOException e){
        return "CLOSED";
    }
    catch(IOException e){
        return "CLOSED";
    }
    return "OPEN";
}

просто новичок, все еще учусь. спасибо!

Ответы [ 2 ]

8 голосов
/ 03 мая 2011

UDP не использует соединение, поэтому вы не можете ожидать ответного пакета, обязательно.Если порт закрыт, вы можете получить сообщение об ошибке ICMP, хотя это не гарантируется (например, брандмауэр может молча отбросить пакет).

3 голосов
/ 03 мая 2011

Сканирование портов UDP возможно , но это сложнее, чем сканирование TCP.

Один из методов, которые я использовал в python, - медленно сканировать хост на трех или четырех UDP-портах с большим номером и проверять сообщения ICMP Port Unreachable от этого хоста. Если вы получите какой-либо из них обратно, вы знаете, что сообщения ICMP разрешены на пути, поэтому вы можете надежно сделать вывод, что отсутствие ответа является открытым портом. Если все эти порты с высокими номерами выходят из строя, вы должны прибегнуть к методам с учетом приложений, чтобы гарантировать успех. Помните, что это следует делать медленно (возможно, раз в секунду или около того), чтобы снизить вероятность ограничения скорости ICMP на уровне хоста.

...