2011-05-03 22 views
5

nuevo aquí, estoy trabajando en un programa para escanear puertos, TCP funciona bien, pero no sé cómo escanear los puertos UDP. Digamos que quiero saber si el puerto UDP XXXX en otro host en esta LAN está abierto. ¿Este código hará el trabajo? si no, ¿cuál es el problema?en Java, ¿cómo lograr escanear puertos UDP?

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"; 
} 

just a newbie, aún aprendizaje. gracias!

Respuesta

8

UDP no tiene conexión, por lo que no puede esperar un paquete de respuesta, necesariamente. Si el puerto está cerrado, es posible que reciba un mensaje de error de ICMP, aunque no hay garantía de esto (por ejemplo, un firewall podría dejar caer el paquete en silencio).

+0

gracias, pero ¿cómo puedo capturar ese mensaje de error ICMP? – ralphxiaoz

+4

DatagramSocket # send arrojaría una PortUnreachableException que puede atrapar. – artbristol

+0

gracias! realmente me ayudó – ralphxiaoz

3

UDP Port Scanning is possible, pero es más difícil que el escaneo TCP.

Un método que he usado en python es escanear lentamente un host en tres o cuatro puertos UDP de alto número y verificar si hay mensajes ICMP Port Incachable de ese host. Si recupera alguno de ellos, sabrá que los mensajes ICMP están permitidos en la ruta, por lo que puede inferir de manera confiable que la falta de respuesta es un puerto abierto. Si todos esos puertos con números altos fallan, debe recurrir a técnicas de aplicación para garantizar el éxito. Tenga en cuenta que esto debe hacerse lentamente (tal vez una vez por segundo aproximadamente) para reducir la probabilidad de limitación de velocidad de ICMP de nivel de host.

+0

gracias, sé que esto servirá, pero no sé cómo lograrlo en Java, ¿alguna idea? – ralphxiaoz