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
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 (http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html) así podrás especificar el timeout en el método connect del socket, A continuación pongo un ejemplo:
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:
sock.connect(isa, 5000);
puedes usarlo de la siguiente manera:
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
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
Puedes mejorar bastante la velocidad cambiando la siguiente linea:
System.out.println("[+] Intentando " + isa.getHostName()
+ ":" + isa.getPort());
por:
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.
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
nadie sabe como se comunica?