Conexion a socket

Iniciado por lomaximo, 25 Mayo 2012, 01:34 AM

0 Miembros y 1 Visitante están viendo este tema.

lomaximo

Buenas amigos, soy nuevo por aqui, tengo una preguntilla, estoy haciendo un bot que se conecta a vnc mediante socket y me diga que vnc no tienen pass para poder conectarse...
Soy algo principiante en java por lo que me esta sacando de quicio esto del socket
String scanVnc(int host)
{

try {

echoSocket.setSoTimeout(1000);
echoSocket = new Socket(host, 5900);
echoSocket.setSoTimeout(1000);
        out = new PrintWriter(echoSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                                    echoSocket.getInputStream()));
    } catch (UnknownHostException e) {
        System.out.println("1 Don't know about"+host);
        return("1 Don't know about"+host);
    } catch (IOException e) {
        System.out.println("2 Couldn't get I/O for "
                           + "the connection to:"+host);
        return("2 Couldn't get I/O for "
                + "the connection to:"+host);
       
    }
    try {
echoSocket.close();
} catch (IOException e) {

e.printStackTrace();
System.out.println("Erreeror");
}
return host;

}


Mi problema es que en lo que va de una ip a otra si no encuentra nada en ellas, se tira dios y su madre ahi...
como podria hacer para qeu según detecte que no hay ningun vnc salte a otra ip sin tardar tanto?.
Un saludo

RyogiShiki

#1
Hola bueno, no deberías tratar al host como un String, o como un int, deberías usar el Objeto concebido para esta tarea, un InetSocketAddres así podrás especificar el timeout en el método connect del socket, A continuación pongo un ejemplo:

Código (java,37) [Seleccionar]
package vnclookup;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
*
* @author ryogi
*/
public class VNCLookUp {
   
   private static InetSocketAddress isa;
   
   public static void main(String[] args) {
       try {
           isa = new InetSocketAddress( args[0],
                   Integer.parseInt(args[1]));
       } catch (ArrayIndexOutOfBoundsException |
               NumberFormatException ex) { // Usar esta linea solo si se tiene el JDK 7 (que permite multicatching)
           System.out.println("[E] Argumentos invalidos.");
           System.exit(-1);
       }
       System.out.println("[+] Intentando " + isa.getHostName()
               + ":" + isa.getPort());
       
       if ( isServerUp(isa) ) {
           System.out.println("[*] Server encontrado.");
       } else {
           System.out.println("[*] Server no encontrado.");
       }
   }
   
   public static boolean isServerUp (InetSocketAddress isa) {
       Socket sock = new Socket();
       try {
           sock.connect(isa, 5000);
       } catch ( IOException ioe) {
           return false;
       }
       return true;
   }
}

Puedes ver como en la linea subrayada se intenta conectar el InetSocketAddress con un timeout de 5 segundos:
Código (java) [Seleccionar]
sock.connect(isa, 5000);

puedes usarlo de la siguiente manera:
Código (bash) [Seleccionar]
java VNCLookUp 192.168.0.1 5900
Donde el primer argumento es la IP y el segundo es el puerto. El código fue probado con un server x11vnc

Espero sea de ayuda.

Saludos


lomaximo

#2
Muchisimas gracias, implante ese codigo y ahora va un poquito mas rapido, pero se nota la diferencia, ahora solo me falta encontrar un servidor vnc para poder hacer pruevas y ver cuando tiene auth y demas...
Muchas gracias, si tengo alguna duda más la posteare por aqui..

PD: ah una cosa, alguien sabe cual es el timeout medio que tarda en conectarse a un vnc, esque 5 me parece muy alto, y tarda mucho de pasar de una ip a otra, pero tampoco quiero que no llege a conectarse por ponerlo

RyogiShiki

#3
Puedes mejorar bastante la velocidad cambiando la siguiente linea:

Código (java) [Seleccionar]
System.out.println("[+] Intentando " + isa.getHostName()
               + ":" + isa.getPort());


por:

Código (java) [Seleccionar]
System.out.println("[+] Intentando " + isa.getHostString()
               + ":" + isa.getPort());


O en particular usando el método getHostString() envés de getHostName()

Así como lo que usas es IPs no se intenta resolver el nombre y debería mejorar.

Saludos.


lomaximo

Gracias de nuevo, tengo otra duda sobre este tema jjejeje
a ver, me he conectado a un servidor rdp, en localhost, como podría desde java sin que se me muestre ninguna imagen, teniendo el usuario y pass guardado en el código de java y que sepa si el usuario es admitido o no?
porque he provado con esto

try {
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
                                echoSocket.getInputStream()));
    } catch (IOException e1) {e1.printStackTrace();}

    String line = null;
try {
System.out.println("1");
while ((line = in.readLine( )) != null)
{
System.out.println(line);
System.out.println("2");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    return true;

pero no me muestra nada en pantalla, solo el 1 de esta linea
System.out.println("1");
pero en cambio el 2 de la linea
System.out.println("2");
no lo muestra, se que se queda en el bucle, pero no llego a comprender porque no me muestra lo del bufferedreader.
Agradeceria si alguien supiese que comando he de enviar para dar un admin y pass, y donde puedo ver este comando para distintos protocolos
Un saludo

lomaximo

nadie sabe como se comunica?