Compruebe si la computadora está conectada a internet

49

Escriba un programa que, de acuerdo con si el script tiene acceso a Internet, produce una salida que es "Truthy / Falsey" . Puede intentar conectarse a cualquier sitio existente, a su propia discreción (no use un sitio sombreado que solo tenga un tiempo de actividad del 10%; intente mantener un tiempo de actividad anual superior al 80%). Si el sitio está caído, su programa no tiene que funcionar.

Debe ser un programa independiente o una función . Puede usar bibliotecas fuera de la biblioteca estándar para lograr esto. Las lagunas estándar están prohibidas. Este es el código de golf, por lo que gana el código con el conteo de bytes más corto.

Pseudocódigo de ejemplo:

function a:
    try:
        connect to internet 
        return 1
    catch error:
        return 0

Esta es mi primera publicación en el código de golf, por lo que si esto viola alguna regla de alguna manera o es un engaño, por favor avísenme.

EDITAR: Debido a numerosas sugerencias, he eliminado la restricción de conteo de bytes UTF-8

Restioson
fuente
44
En lugar de truey false, recomiendo permitir cualquiera de nuestros valores predeterminados de veracidad y falsedad . Además, por internet, ¿se refiere a la red fuera de su red local? ¿Los programas todavía tienen que funcionar si Google dice que está inactivo o cualquier otro sitio grande?
Azul
3
El recuento de bytes generalmente se realiza en la codificación nativa o más conveniente del idioma, que no siempre es UTF-8. A menos que tenga una buena razón para aplicar UTF-8, creo que la codificación debe dejarse a elección del programador
Luis Mendo
44
Veo que casi todos usan g.gl/http://g.gl/ , pero to./http://to./ parece ser un byte más corto (no todos los idiomas lo ven como una URL válida).
Kevin Cruijssen
99
Commodore Basic:PRINT "0"
Mark
3
La misma máquina en la que estoy escribiendo esto es técnicamente una parte de "Internet", ya que se puede acceder desde el exterior (a través de NAT y reenvío de puertos). Entonces, si piensas en ello, el script de "detección de internet" probablemente se puede reducir a "verdadero" :)
zeppelin

Respuestas:

29

Bash (con dnsutils ), 3 bytes

Envía una solicitud DNS para "." (Raíz DNS), el código de salida es 0 para el éxito y> 0 en caso contrario.

Golfed

dig

Prueba

% dig >/dev/null; echo $?;        
0

% nmcli nm wifi off
% dig >/dev/null; echo $?;
9

Descargo de responsabilidad

Obviamente, esto solo funcionará si su servidor DNS está en la red del proveedor, es decir, en "Internet" (ya que su red de proveedor normalmente forma parte de él), o si su sistema está utilizando un servidor DNS público (como 8.8.8.8 de Google, que usan los sistemas basados ​​en Android), de lo contrario, puede obtener una copia en caché de un servidor LAN local (o localhost).

Pero supongo que esto no va en contra de las reglas del , ya que obviamente hay más de un sistema en el que esto funciona según lo previsto.

Los métodos HTTP puros también pueden dar falsos positivos, debido a un proxy de almacenamiento en caché intermedio, y no se garantiza que funcionen en todas partes, por lo que no es algo exclusivo de este método.

Una versión un poco más confiable, 8 bytes

dig +tra

(Un pequeño homenaje a @ Dig ital Tra uma!)

Habilita el "modo de rastreo", que obligará a cavar a hacer la búsqueda recursiva por sí mismo (consulte https://serverfault.com/a/778830 ), evitando cualquier problema de caché.

zepelín
fuente
Cita de man dig: A menos que se le indique que consulte un servidor de nombres específico, dig intentará con cada uno de los servidores enumerados en /etc/resolv.conf . Si no se encuentran direcciones de servidor utilizables, dig enviará la consulta al host local .
Titus
@Titus, sí, eso es correcto, vea la parte de "descargo de responsabilidad" de mi respuesta, pero siempre que su servidor DNS (como se especifica en su resolv.conf) esté del lado de su proveedor, funciona bien.
zepelín
Su solución depende de una instalación no predeterminada; Yo consideraría que explotar una escapatoria. Todavía puedes ganar con los dos bytes adicionales.
Titus
1
> Su solución depende de una instalación no predeterminada No, es exactamente cómo funciona en mi máquina (y eso ya es suficiente según Meta). Además, usar el servidor DNS de su proveedor es una configuración bastante común (y normalmente también estará en su resolv.conf).
zepelín
2
La configuración definitiva depende de la configuración que utilizó en el momento de la instalación si configuró la red utilizando DHCP y luego resolv.conf probablemente apunta a su enrutador. Si configuró la red manualmente, tendrá el servidor DNS que haya designado.
Jasen
19

Bash + GNU utils, 8

  • 5 bytes guardados gracias a @Muzer.
wget to.

Las otras respuestas de shell comprueban el código de retorno y hacen eco de alguna salida de estado en consecuencia. Esto es innecesario El código de retorno de shell ya es un código utilizable de Truthy / Falsey y accesible en el $?parámetro que es idiomático para bash. El código de retorno 0 significa verdadero. El código de retorno> 0 significa falso.

En uso:

ubuntu@ubuntu:~$ wget to.
--2017-01-13 09:10:51--  http://to./
Resolving to. (to.)... 216.74.32.107, 216.74.32.107
Connecting to to. (to.)|216.74.32.107|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11510 (11K) [text/html]
Saving to: index.html.6

index.html.6        100%[===================>]  11.24K  --.-KB/s    in 0.04s   

2017-01-13 09:10:51 (285 KB/s) - index.html.6 saved [11510/11510]

ubuntu@ubuntu:~$ echo $?
0
ubuntu@ubuntu:~$ sudo ifconfig ens33 down
ubuntu@ubuntu:~$ wget to.
--2017-01-13 09:11:00--  http://to./
Resolving to. (to.)... failed: Temporary failure in name resolution.
wget: unable to resolve host address to.’
ubuntu@ubuntu:~$ echo $?
4
ubuntu@ubuntu:~$ sudo ifconfig ens33 up
ubuntu@ubuntu:~$ # Local network up, upstream link down
ubuntu@ubuntu:~$ wget to.
--2017-01-13 09:11:34--  http://to./
Resolving to. (to.)... failed: Name or service not known.
wget: unable to resolve host address to.’
ubuntu@ubuntu:~$ echo $?
4
ubuntu@ubuntu:~$ 
Trauma digital
fuente
2
Use un dominio como en to.lugar de 8.8.8.8, para ahorrar bastante.
Muzer
@ Muzer sí, gracias
Digital Trauma
2
@Muzer a menos que haya un local toque el resolutor esté configurado para buscar, seguirá yendo al correcto (y tal vez poder hacer ping a un local toes suficiente para estar conectado a Internet )
Christian Sievers
2
@ Muzer OK, a toveces funciona y a veces no. Supongo que hay algo de caché. Lo usaré to.solo por seguridad.
Trauma digital el
44
¿Por qué es un dominio válido?
Kos
9

Lote de 8 bytes.

ping to.

pingestablecerá ERRORLEVELa 1si la dirección no se puede resolver o alcanzado.

Neil
fuente
7

05AB1E , 11 9 bytes

Guardado 2 bytes en "a". cortesía de ev3commander

…to..wgX›

Comprueba si la longitud del contenido en http: // a . es mayor que 1.
.wdevuelve 0 en caso de error.

Emigna
fuente
1
Siempre un +1 para respuestas
05AB1E
@WorseDoughnut ¿Y por qué es eso?
mbomb007
3
@ mbomb007 Acabo de ser un gran fanático del lenguaje desde que Adnan comenzó a trabajar en él y lo publicó aquí; Definitivamente es un lenguaje fascinante para profundizar.
WorseDoughnut
1
@WorseDoughnut Ya hay un hipervínculo en la respuesta.
mbomb007
¿No puedes conectarte a? para guardar un byte?
ev3commander
5

MATL , 15 14 bytes

Un byte guardado gracias a la sugerencia de Kevin Cruijssen

'http://to.'Xi

La salida es a través de STDOUT. Esto muestra una cadena no vacía que contiene caracteres distintos de cero (lo cual es cierto) si hay una conexión a Internet; y no muestra nada (lo cual es falso) si no hay conexión.

Esto no se puede probar en línea porque Xino está permitido en los intérpretes en línea.

Explicación

'http://to.'  % Push this string
Xi            % Return contents of that URL as a string. If there is no Internet
              % connection this gives an error, with no output on STDOUT
Luis Mendo
fuente
¿Considerarías urlread('http://g.gl')que es una respuesta correcta por sí misma? Se producirá un error y dejará el espacio de trabajo vacío si la conexión no funciona. Mostrará un mensaje de error, pero técnicamente eso es para STDERR ...? Pensé que era un poco exagerado, así que lo hice de esta manera . Pero saltar tryparece dar el mismo resultado que tu código, o? Dejas la pila vacía también, ¿no? Buena respuesta por cierto ... :)
Stewie Griffin
@StewieGriffin ¡Gracias! Sí, creo que urlread('http://g.gl')es válido (y es el mismo que mi código), ya que STDERR se ignora por defecto y un STDOUT vacío es falso en MATLAB
Luis Mendo
1
¿funcionaría esto en ftplugar de http- guardar otro byte?
Floris
1
@Floris ¡Me alegro de verte también aquí! Lamentablemente ftpno parece funcionar para ese sitio
Luis Mendo
1
Hola @LuisMendo, sí, a veces merodeo por otros sitios ... ¡lástima que el ftp no funcione!
Floris
5

Bash 66 62 21 bytes

ping -c1 g.gl echo $?

Gracias @Alex L. por el consejo de acortamiento de URL.

Versión sin golf:

r=$(ping -c1 g.gl)
if [ $? -ne 0 ];
 then echo "0"
else echo "1"
fi

Esta es mi primera respuesta en Bash, no estoy seguro de haber acortado lo suficiente el script.

Abel Tom
fuente
Creo que puede usar una URL más corta que google.com, lo que le permitiría acortar el código. Algo como g.gl.
HyperNeutrino
3
También debería poder simplemente en echo $?lugar de esa declaración if completa.
SomethingDark
44
te perdiste "algunos" ;en la línea de golf.
Ipor Sircer
@IporSircer Gracias. :) @SomethingDark Hola, echo $? imprime un 0éxito, o de lo contrario devuelve un 2en este caso. No he examinado el código fuente de la implementación, pingpero supongo que hay diferentes códigos de retorno dependiendo de la situación. Por lo tanto, usé la if elseestrategia.
Abel Tom
@AbelTom: se podría argumentar que 0 es verdadero y que no 0 es falsey.
Algo
5

R, 20 bytes

curl::has_internet()

Hay una función para exactamente esta tarea en el curlpaquete.

Billywob
fuente
1
+1 buen hallazgo. Para aquellos curiosos como yo, esta función se implementa como:function() !is.null(nslookup("r-project.org", error = FALSE))
plannapus
Recuento equivalente: httr::url_ok('g.gl')(aunque en desuso).
Jonathan Carroll
5

Java, 72 bytes

a->new java.net.InetSocketAddress("to.",80).getAddress().isReachable(9);
Huntro
fuente
3
java.net.InetSocketAddress
4

Perl, 15 bytes

print`curl to.`

Corre con:

perl -e 'print`curl to.`' 2> /dev/null

curlsalidas de productos STDERR, no les importa. Si la computadora tiene acceso a Internet, imprimirá algunas líneas de html (verdadero), de lo contrario, no imprimirá nada (falso).

Ahorré 1 bytes usando to.(en lugar de mi anterior b.io) gracias a @Kevin Cruijssen.

Dada
fuente
¿No podrías cambiar a bash y eliminar el print?
BlueRaja - Danny Pflughoeft
1
@ BlueRaja-DannyPflughoeft Yup, eso funcionaría (aunque ya hay una respuesta en bash (usan en wgetlugar de curlpero es lo mismo)).
Dada
4

C #, 87 bytes

_=>{try{new System.Net.WebClient().OpenRead("http://g.gl");return 1;}catch{return 0;}};

Si una excepción se considera falsey, que no creo que sea, entonces son 65 bytes:

_=>new System.Net.WebClient().OpenRead("http://g.gl").ReadByte();

También intenté usar el enlace http://to.según lo indicado por @KevinCruijssen pero no pareció funcionar.

TheLethalCoder
fuente
4

8 , 23 21 bytes

Dos bytes guardados gracias a la sugerencia de Kevin Cruijssen y a mi descubrimiento:http: // parece funcionar tan bien comohttp: // a . (guardando otro byte)

"http://to" net:get .

Si se puede acceder al sitio http: // to , se imprime true. De lo contrario, se imprime false. Deja los datos recuperados en la pila.

Chaos Manor
fuente
1
TOS significa t op o f s tack. Creo que quieres decir que solo deja datos en la pila.
Roman Gräf
Eso es correcto. Mejoré mi explicación. Gracias.
Chaos Manor
@ ev3commander ¿Has probado con http: // to ? Funciona en mi caso (veo una página predeterminada de Ubuntu Apache2). Parece que no hay necesidad de agregar '.' o '/'
Chaos Manor
3

MATLAB, 32 22 bytes

urlread('http://g.gl')

Explicación:

Si la conexión a Internet está activa, esto dará como resultado ans(la variable predeterminada) una cadena con todo el código html en texto plano (lo cual es cierto en MATLAB).

Si la conexión a Internet no funciona, esto escribirá un mensaje de error en STDERR y dejará el espacio de trabajo vacío (que es falso en MATLAB).

Desafortunadamente, urlreadrequiere una dirección URL completa , por g.gllo que no es suficiente. 11 de los 22 bytes son, por lo tanto, solo la dirección URL.


Enfoque alternativo:

Una solución que detecta el error y deja un 0 (también falso ) en el espacio de trabajo si la conexión no funciona:

0;try urlread('http://g.gl'),end

0;inicializa la variable predeterminada ansa 0, que está falseen MATLAB. Luego vamos trya leer la url. Esto dará un error si la conexión a Internet no funciona, o una matriz de caracteres si no (que está trueen MATLAB).

No necesitamos atrapar nada, así que simplemente terminamos. Si la llamada urlread fue exitosa, entonces ansserá una cadena larga con el contenido del sitio web, de lo contrario ans=0.

Stewie Griffin
fuente
3

Bash, 39 bytes

exec 4<>/dev/tcp/to./80&&echo 1||echo 0
GB
fuente
1
! exec 4<>/dev/tcp/to./80;echo $?
Jasen
o si no necesita imprimir verdadero / falso pero puede devolverlo,exec 4<>/dev/tcp/to./80
Jasen
3

JavaScript ES6, 71 43 bytes

fetch``.then(a=>alert(1)).catch(a=>alert``)

Alertas 1 si está en línea, alerta una cadena vacía si está fuera de línea. Gracias a Patrick Roberts por ayudarme a eliminar algunos bytes

Versión antigua

_=>fetch('http://enable-cors.org').then(a=>alert(a)).catch(a=>alert(0))

Alertas [object Reponse]si está en línea, alertas 0si está fuera de línea

Se eliminó el fragmento de código, no funciona porque se carga desde un dominio diferente sin CORS, pero funciona en la consola del navegador

Zanchi
fuente
Hmm Esto imprime correctamente "verdadero" cuando estoy conectado, pero no imprime nada si lo desconecto y lo ejecuto en mi navegador. ¿En qué navegador / SO probaste esto? Estoy usando chrome-win7
DJMcMayhem
@DJMcMayhem ¿Cómo está tu caché?
Ismael Miguel
@DJMcMayhem Probé en Chrome, Win10. Caché Desactivado en la pestaña de la red y comprueba sin conexión a prueba fuera de línea / en línea
Zanchi
Este puede ser un programa completo en 52 bytes:fetch('://to.').then(a=>alert(1)).catch(a=>alert(0))
Patrick Roberts
2

JavaScript ES6, 90 81 Bytes

f=a=>{i=new Image();i.src="//placehold.it/1x1";i.onload=b=>a(1);i.onerror=c=>a()}

JavaScript ES6, 22 21 bytes (no válido)

Algunos navegadores no son totalmente compatibles o no producen el resultado esperado cuando se utiliza navigator.onLine.

f=a=>navigator.onLine
Tom
fuente
2
Esta respuesta implica que esto no siempre será falso cuando no esté conectado a Internet
azul el
Puede guardar un byte agregando un parámetro a la lambda, así:f=a=>
XavCo7
1
Aunque su respuesta todavía parece no ser válida, puede deshacerse de ella f=.
Mama Fun Roll
1
78 bytes: a=>{with(new Image()){src="//placehold.it/1x1";onload=b=>a(1);onerror=c=>a()}}´ (got rid of f = `y usado with(){})
Ismael Miguel
2

Scala, 54 bytes

x=>(Runtime.getRuntime exec "ping -c 1 ai."waitFor)<1

Bastante simple; ejecuta un comando ping a http://ai./, y devuelve verdadero si sale con 0, o falso en caso contrario.

corvus_192
fuente
2

Brainfuck (no competidor) 21 bytes

++++++[>++++++++<-]>.

Brainfuck no puede conectarse a Internet (por lo que yo sé), por lo que como el programa no puede conectarse, la respuesta es siempre 0

No compite porque parece caer dentro del vacío estándar de salida codificado , a pesar de que este programa técnicamente es correcto para el desafío.

Cody
fuente
Brainfuck no se puede conectar, pero la computadora en la que estoy ejecutando esto todavía se puede conectar a Internet (o no). Una solución adecuada de brainfuck es un programa que siempre responde "No lo sé"
Kos
2
@Kos "No sé" no es verdad / falsey
Restioson
No es "No sé", es "No puedo, por lo tanto, la respuesta es no"
Cody
tal vez solo imprima el byte '\ 0' ya que también es 0. usted tendría un código de solo 1 byte
12431234123412341234123
2

Powershell, 64 26 23 bytes

Ahorró 38 bytes, gracias a Shawn Esterman

Guardado 3 bytes y script reparado, gracias a briantist

Test-Connection -q g.gl
Horváth Dávid
fuente
Test-Connection -Quiet a.
Shawn Esterman el
PowerShell no se puede resolver to., deberías usarlo g.glen su lugar. Además puedes acortarlo a Test-Connection -q g.gl.
briantist
2

PHP, 23 PHP + Curl, 14

Usando el operador de backtick de PHP:

<?=`curl to.`;

Respuesta original:

Intentaré comenzar:

<?=file('http://x.gl');

Esto no genera nada si no se puede alcanzar x.gl y Arraysi lo es.

Otra versión donde no estoy muy seguro si encajan:

<?=getmxrr('x.gl',$a);  // 22 chars
Christoph
fuente
44
Re "es una laguna", creo que el consenso normal es que cuenta como un dialecto del idioma (por lo que la respuesta es PHP + Curl, 15 bytes ).
¿Una matriz cuenta como verdadera? Sin embargo, permitiré que compita de todos modos, ya que es mi pregunta. Solo por interés.
Restioson
@Restioson php convierte una matriz en la cadena "Array"cuando intentas imprimirla ( <?=) y boolean false se convertirá a "". Por lo tanto, el valor de retorno real no es una matriz, sino una cadena no vacía o una cadena vacía.
Christoph
@Cristoph No creo que "Array" cuente como verdadero o falso
Restioson
@Restioson Es una cadena que se convierte implícitamente en boolean true. Se if ("Array") echo 'thruthy';tomaría una rama , por lo tanto, es verdad . La cadena vacía no tomaría la rama y, por lo tanto, es falsey.
Christoph
2

Python 3 + solicitudes, 59 55 53 bytes

Tiene que haber una respuesta de solicitud, ¿verdad?

from requests import*
try:get("http://to.")
except:Z

El estado de salida es 0 para internet, 1 para no internet. Ejemplo:

$ python inet.py 
$ echo $?
0
$ # Remove ethernet cable
$ python inet.py 
$ echo $?
1

Registro de cambios:

  • -4 bytes (gracias Mego)
matsjoyce
fuente
Podría acortar esto usando un protocolo diferente ( ftpquizás) y haciendo except:0/0.
Mego
@Mego Creo que las solicitudes solo hacen http (s). He agregado el 0/0.
matsjoyce
1

Elixir, 33 bytes

{:ok,_}=:inet.getaddr('to',:inet)

0 si está conectado, 1 de lo contrario.

movsx
fuente
1

Mathematica 10 Bytes

Suponiendo que tiene una copia válida de Mathematica y credenciales de inicio de sesión en user.wolfram.com

CloudPut@1

escribirá el valor 1 en la nube. Verdad: CloudObject [""] Falsey: $ Failed

CloudGet@%

Devolverá el valor 1 que se cargó en la nube.

Kelly Lowder
fuente
1
Tenga en cuenta que, de forma predeterminada, los fragmentos REPL no están permitidos. Poner &después para convertirlo en una función sin nombre.
LegionMammal978
¿Me puede señalar un enlace?
Kelly Lowder
1
En mi opinión, esta es la mejor respuesta aquí. Pero, ¿el objeto Cloud cuenta como verdadero? Sin embargo, diría que el 1 en la nube es verdadero. ¡Buena respuesta!
Restioson
@ LegionMammal978, puedo poner el código, tal como está, en un archivo de paquete .wl y ejecutarlo como un "programa" según lo permita la pregunta original. Normalmente, este tipo de preguntas requieren una función con entradas; No es necesaria la entrada del usuario. Además, la prueba de mi verdad / falso como función funciona igual de bien con o sin el &. En CloudPut@1&===$Failedel & no hace absolutamente ninguna diferencia. Por último, el programa devuelve e imprime la salida, por lo que, de hecho, no es un fragmento REPL como usted sugiere.
Kelly Lowder
1

Python 2.7, 70 77 Bytes

from urllib import*
a=1
try:urlopen('http://to.')
except:a=0
print a

import urllib as l
try: 
 l.urlopen('http://a.uk')
 print 1
except:
 print 0

Utiliza 1 para la verdad, 0 para la falsedad. a.uk redirige a una empresa de ropa de motos. Se guardaron 3 bytes al asignar a una variable e imprimir eso. Y otro para el "a". truco (confirmado para trabajar con urllib), dos para deshacerse de los molestos sangrados.

Chris H
fuente
Creo que from urllib import*podría ahorrar un char (y caer, l.por supuesto).
Nick T
@NickT me olvidó que podría caer el espacio entre importy *por lo que creo que tienes razón, pero estoy en el móvil y lo arreglaré más tarde
Chris H
1

Julia + Bash (con dnsutils), 10 bytes

run(`dig`)

`command`en julia crea un cmdobjeto con el que se puede ejecutar run.

Rɪᴋᴇʀ
fuente
0

Clojure, 49 bytes

#(try(slurp"http://to.")1(catch Exception _ nil))

Devuelve 1si se puede conectar, y de lo nilcontrario.

Solo intenta slurpla página; lanzando una NoRouteToHostExceptionexcepción en caso de falla, que se detecta.

Desafortunadamente, el protocolo y el punto parecen ser obligatorios.

Carcigenicate
fuente
0

Javascript (Nashorn), 61 bytes

print(new java.net.InetSocketAddress("to.",80).getAddress())

Basado en la respuesta Java de Huntro.

SuperJedi224
fuente