Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

IO::Socket::INET Ayuda

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie Mar 08, 2006 12:52 am
novatito
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Mar 2006
Mensajes: 3
IO::Socket::INET Ayuda Responder citando

Que tal? soy nuevo en el mundo de perl y me surgio un problema haciendo un script para que lea un archivo de ips y verifique si tiene un puerto X abierto, es una especie de scanner, que al crear el socket "$sock = IO::Socket::INET->new(PeerAddr => "$IP[$a]" , PeerPort => 80, Proto => "tcp", Timeout => 1)" y ponerle un || $a++; para que vaya incrementado tengo un problema al llegar a una ip cuyo puerto esta cerrado y me devuelve connection refused el script se queda trabado en esa ip y no puedo hacer mas nada, alguien por favor me podria decir un metodo para chequear que una ip X al tener el puerto completamente cerrado la pase de largo y siga con las demas ya que el || $a++; no funciona con ese tipo de casos, realmente busque en todos lados y no encontre nada de gran ayuda.

Gracias de antemano.
Mensaje Mie Mar 08, 2006 12:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
Responder citando

Hecha un vistazo a este código.
Código:
foreach (; $port<=$maxport; $port++)
{
        $socket= new IO::Socket::INET (
                PeerAddr=>"$target:$port",
                Proto=>'tcp',
                Timeout=>'1' ); # Timeout.

        if ($socket) {  # Port listening.
                $openport++;
                print "\tPort $port ";
                # ...
       }
}
Mensaje Mie Mar 08, 2006 5:44 pm
novatito
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Mar 2006
Mensajes: 3
Responder citando

Ok, explorer, muchas gracias. Voy a echarle un vistazo.
Mensaje Mie Mar 08, 2006 6:46 pm
novatito
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Mar 2006
Mensajes: 3
Responder citando

humm... funcionó pero ahora tengo otro problema: resulta que cuando entro a un servidor que tiene el puerto 80 abierto y telneteo y hago un GET y no obtengo respuesta alguna. Se traba el script en esa IP y no puedo hacer que cierre la conexión y siga con la IP siguiente. ¿Alguna idea?
Mensaje Jue Mar 09, 2006 1:28 am
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

explorer escribió:
Hecha un vistazo a este código.
Código:
foreach (; $port<=$maxport; $port++)
{
        $socket= new IO::Socket::INET (
                PeerAddr=>"$target:$port",
                Proto=>'tcp',
                Timeout=>'1' ); # Timeout.

        if ($socket) {  # Port listening.
                $openport++;
                print "\tPort $port ";
                # ...
       }
}


Supongo que el código no es tuyo, y lo pusiste con fines de ejemplificar, sin embargo está feamente escrito y con muy muy malas prácticas, en lo personal no lo recomendaría.

Sin embargo volviendo al problema principal, si tus necesidades son "pequeñas" y rápidas en cuanto al port scanner que quieres, haciendo un telnet a X puerto con Net::Telnet funcionaría. Si tus necesidades son mas "específicas" en cuanto a que tan verídicos quieres los resultados, te recomiendo echarle un vistazo a Nmap::Scanner ( requiere de nmap ).

Escribir el port scanner a mano no está mal, simplemente ya hay herramientas que te permiten hacerlo de manera aun mas sencilla, si no se adaptan a lo que requieres entonces adelante, IO::Socket::INET o en su defecto Socket te dá la mano.

Para tu problema final, intenta estableciendo timeouts mas pequeños, para uqe la conexión la cierre en ese tiempo y puedas continuar.

Saludos,
Mensaje Jue Mar 09, 2006 12:46 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
Responder citando

novatito escribió:
mm funciono pero ahora tengo otro problema resulta que cuando entro a un servidor que tiene el puerto 80 abierto y telneteo y hago un GET y no obtengo respuesta alguna se traba el script en esa ip y no puedo hacer que cierre la conexion y siga con la ip siguiente, alguna idea?
Para eso están los timeouts. Repasa la documentación del módulo que estás usando, en lo referente a timeout.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group