Mie Mar 08, 2006 12:52 am
|
 |
novatito
Perlero Nuevo

|
Registrado: 08 Mar 2006
Mensajes: 3
|
|
| IO::Socket::INET Ayuda |
|
|
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. |
|
|
|

Mie Mar 08, 2006 12:12 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
|
|
|
|
|
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 ";
# ...
}
} |
|
|
Mie Mar 08, 2006 5:44 pm
|
 |
novatito
Perlero Nuevo

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

|
Registrado: 08 Mar 2006
Mensajes: 3
|
|
|
|
|
| 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? |
|

Jue Mar 09, 2006 1:28 am
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| 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, |
|

Jue Mar 09, 2006 12:46 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4123
Ubicación: Valladolid, España
|
|
|
|
|
| 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. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|