Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » Comprobar conexión a Internet Responder al tema
Nuevo tema


Página 1 de 1  [ 6 mensajes ] 
 
Nota 2012-01-10 13:11 @591

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Comprobar conexión a Internet
Hola. Necesito saber si existe algún módulo que te permita hacer un script que te diga si el ordenador en el que estás tiene conexión a Internet o no. ¿Alguien sabe de alguno?


Nota 2012-01-10 13:49 @617
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Comprobar conexión a Internet
Hay muchas maneras. Una de ellas es mandando un paquete ping a un servidor conocido:

Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Software/> perl -Mutf8::all -MNet::Ping -E '$p = Net::Ping->new("syn"); $p->bind("localhost"); say "Sí" if $p->ping("8.8.8.8", 5); '

_________________
JF^D Perl programming


Nota 2012-01-11 04:35 @233

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Re: Comprobar conexión a Internet
Hola explorer. Yo creo que algo he puesto mal porque aunque no tenga conexión a Internet siempre me dice que sí :?

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use utf8::all;
  2. use Net::Ping;
  3.  
  4. my $p = Net::Ping->new("syn");
  5. $p->bind("localhost");
  6. if ($p->ping("8.8.8.8", 5)){
  7.    
  8.     print  "YES\n";
  9. }else{
  10.    
  11.     print "NO\n"
  12. }


Nota 2012-01-11 08:15 @385
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Comprobar conexión a Internet
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:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use Net::Ping;
  2.  
  3. my @host_array = qw(
  4.     www.amazon.es
  5.     google.es
  6. );
  7.  
  8. $p = Net::Ping->new("syn");                          # nuevo intento ping, con protocolo syn
  9. $p->port_number((getservbyname("http", "tcp"))[2]);  # nos conectamos al puerto http
  10. foreach $host (@host_array) {                        # para cada host
  11.     $p->ping($host);                                 # le enviamos un ping
  12. }
  13.  
  14. while (($host,$rtt,$ip) = $p->ack) {                 # esperamos la respuesta
  15.     print "HOST: $host [$ip] ACKed in $rtt seg.\n";  # alguien nos ha respondido. Informamos
  16. }
  17.  

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.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use Net::Ping::External qw(ping);
  2.  
  3. my $conexion = ping(hostname => "google.es", timeout => 5);
  4. if($conexion) {
  5.     say "Sí hay conexión";
  6. }

_________________
JF^D Perl programming


Nota 2012-01-20 05:29 @270

Perlero Frecuente
Registrado: 2011-04-05 11:14 @510
Mensajes: 148
Re: Comprobar conexión a Internet
Una pregunta: ya he probado en mi casa y sí me funciona correctamente, pero lo he probado en otro lado y siempre me dice que no hay conexión. ¿Eso por qué puede ser? ¿Puede que sea por algún puerto que esté cerrado o algo?


Nota 2012-01-20 17:40 @778
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Comprobar conexión a Internet
El programa depende de las posibilidades de resolución de nombres del ordenador donde se está ejecutando. Y, también, de si tiene filtrado o no el protocolo que estás usando (syn o icmp).

Para el primer caso, lo resuelves poniendo la dirección IP, en lugar del nombre.

Para el segundo caso... pues no te vale este programa, y deberás usar otro método. Por ejemplo, es posible que no esté filtrado el puerto 80, así que puedes hacer una petición HTTP al servidor remoto (y que éste sí tenga ese protocolo activo, y que el ordenador local no filtre nuestra petición).

_________________
JF^D Perl programming


Responder al tema  [ 6 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO