El que se ha equivocado soy yo. El protocolo "syn" no funciona de esa manera.
El programa lo tienes bien, pero te dice siempre que sí, porque está diciendo que ha conseguido enviar el paquete, no que lo ha enviado y recibido correctamente. Y eso es lo que queremos, no solo saber si lo ha conseguido enviar.
No te puse el protocolo "icmp", porque según el manual de
Net::Ping es necesario ejecutar el programa con permisos de
root:
perl -Mutf8::all -MNet::Ping -E '$p = Net::Ping->new("icmp"); say "Sí" if $p->ping("8.8.8.8", 10);'Esa línea sólo funcionará si la ejecutas como
root, lo cual no siempre es así (querrás que tu programa lo ejecuten otros usuarios).
Entonces, lo que se puede hacer es comprobar si llega el paquete de respuesta:
Using perl Syntax Highlighting
use Net::Ping;
my @host_array = qw(
www.amazon.es
google.es
);
$p = Net::Ping->new("syn"); # nuevo intento ping, con protocolo syn
$p->port_number((getservbyname("http", "tcp"))[2]); # nos conectamos al puerto http
foreach $host (@host_array) { # para cada host
$p->ping($host); # le enviamos un ping
}
while (($host,$rtt,$ip) = $p->ack) { # esperamos la respuesta
print "HOST: $host [$ip] ACKed in $rtt seg.\n"; # alguien nos ha respondido. Informamos
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Como ves, se trata de decidir por qué puerto queremos hacer la petición (entonces, necesitamos saber que lo tiene abierto), luego le enviamos un ping, y esperamos la respuesta. Si no sale nada, es que no hemos recibido nada. O que la máquina no ha conseguido resolver los nombres, lo cual nos daría lo mismo que si no estuviéramos conectados (aquí se pueden poner las IP en lugar de los nombres de las máquinas, si las sabemos).
Otra opción: usar el comando ping del sistema. Esta es una opción mejor, ya que enviamos paquetes ICMP, sin tener que decir a qué puerto queremos hacer la prueba. Y sin tener que ser
root. Solo hay que preocuparnos de que ese comando está instalado en el sistema, lo cual es cierto para la gran mayoría de ellos. Con el módulo
Net::Ping::External puedes hacer ping desde Linux, MSWin32, Cygwin, Solaris, BSdos, Beos, HPUX, DEC_osf, BSD, Darwin, Openbsd, Freebsd, Next, Unicosmk, Netbsd, Irix y Aix.
Using perl Syntax Highlighting
use Net::Ping::External qw(ping);
my $conexion = ping(hostname => "google.es", timeout => 5);
if($conexion) {
say "Sí hay conexión";
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4