• Publicidad

Comprobar conexión a Internet

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Comprobar conexión a Internet

Notapor jacks » 2012-01-10 13:11 @591

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?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Publicidad

Re: Comprobar conexión a Internet

Notapor explorer » 2012-01-10 13:49 @617

Hay muchas maneras. Una de ellas es mandando un paquete ping a un servidor conocido:

Sintáxis: [ Descargar ] [ Ocultar ]
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); '
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comprobar conexión a Internet

Notapor jacks » 2012-01-11 04:35 @233

Hola explorer. Yo creo que algo he puesto mal porque aunque no tenga conexión a Internet siempre me dice que sí :?

Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comprobar conexión a Internet

Notapor explorer » 2012-01-11 08:15 @385

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.  
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.

Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comprobar conexión a Internet

Notapor jacks » 2012-01-20 05:29 @270

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?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comprobar conexión a Internet

Notapor explorer » 2012-01-20 17:40 @778

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 20 invitados