Vérifiez si l'ordinateur est connecté à Internet

49

Ecrivez un programme qui, selon que le script a accès à Internet ou non, génère une sortie "Truthy / Falsey" . Vous pouvez essayer de vous connecter à n'importe quel site existant, à votre propre discrétion (n'utilisez pas un site ombragé qui ne dispose que de 10% de disponibilité - essayez de conserver une disponibilité annuelle supérieure à 80%). Si le site est en panne, votre programme n'a pas à fonctionner.

Ce doit être un programme autonome ou une fonction . Vous pouvez utiliser des bibliothèques en dehors de la bibliothèque standard pour y parvenir. Les failles standard sont interdites. C'est le code golf, le code avec le plus petit nombre d'octets gagne.

Exemple de pseudocode:

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

Ceci est mon premier article sur le code golf, donc si cela enfreint les règles de quelque manière que ce soit ou est une dupe, s'il vous plaît, alertez-moi.

EDIT: En raison de nombreuses suggestions, j'ai supprimé la restriction du nombre d'octets UTF-8

Restioson
la source
4
Au lieu de trueet false, je recommande d’autoriser l’un quelconque de nos défauts pour la vérité et la fausseté . Aussi, par internet, voulez-vous dire le réseau en dehors de votre réseau local? Est-ce que les programmes doivent encore fonctionner si, par exemple, Google est en panne ou tout autre site volumineux?
Bleu le
3
Le nombre d'octets est généralement effectué dans le codage natif ou le plus pratique du langage, qui n'est pas toujours UTF-8. À moins que vous n'ayez une bonne raison d'appliquer UTF-8, je pense que le codage devrait rester au choix du programmeur
Luis Mendo le
4
Je vois que presque tout le monde utilise g.gl/http://g.gl/ , mais to./http://to./ semble être un octet plus court (toutes les langues ne le voient pas comme une URL valide).
Kevin Cruijssen le
9
Commodore Basic:PRINT "0"
Marquez le
3
La machine sur laquelle je tape ceci fait techniquement partie d'Internet, car on peut y accéder de l'extérieur (via NAT et redirection de port). Donc, si vous y pensez, le script de "détection Internet" peut probablement être réduit à "vrai" :)
zeppelin

Réponses:

29

Bash (avec dnsutils ), 3 octets

Envoie une requête DNS pour "." (Racine DNS), le code de sortie est 0 en cas de succès et> 0 dans le cas contraire.

Golfé

dig

Tester

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

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

Avertissement

Cela ne fonctionnera évidemment que si votre serveur DNS est installé sur le réseau du fournisseur, c'est-à-dire "Internet" (votre réseau de fournisseur en fait normalement partie), ou si votre système utilise un serveur DNS public (comme 8.8.8.8). de Google, utilisés par les systèmes Android), sinon vous pouvez obtenir une copie en cache d’un serveur LAN local (ou localhost).

Mais je suppose que cela n’est pas contraire aux règles du , car il existe évidemment plus d’un système dans lequel cela fonctionne comme prévu.

Les méthodes purement HTTP peuvent également donner des faux positifs, en raison d'un proxy de mise en cache intermédiaire, et leur fonctionnement ne doit pas forcément fonctionner partout. Il ne s'agit donc pas d'un procédé unique à cette méthode.

Une version légèrement plus fiable, 8 octets

dig +tra

(un petit hommage à @ Dig ital Tra uma!)

Active le "mode de trace", ce qui obligera digéré à effectuer lui-même la recherche récursive (voir https://serverfault.com/a/778830 ), en évitant les problèmes de cache.

Zeppelin
la source
Citation de man dig: À moins qu'il ne soit demandé d'interroger un serveur de noms spécifique, dig essaiera chacun des serveurs répertoriés dans /etc/resolv.conf . Si aucune adresse de serveur utilisable n'est trouvée, dig enverra la requête à l' hôte local .
Titus le
@ Titus, oui, c'est correct, voir la partie "disclaimer" de ma réponse, mais tant que votre serveur DNS (comme spécifié dans votre resolv.conf) se trouve du côté de votre fournisseur, cela fonctionne simplement bien.
Zeppelin le
Votre solution dépend d'une installation autre que celle par défaut. Je considérerais cela comme exploitant une échappatoire. Vous pouvez toujours gagner avec les deux octets supplémentaires.
Titus
1
> Votre solution dépend d’une installation autre que celle par défaut, c’est exactement comment cela fonctionne sur ma machine (et cela suffit déjà selon Meta). De plus, utiliser le serveur DNS de votre fournisseur est une configuration assez courante (et ce sera normalement aussi dans votre resolv.conf).
Zeppelin
2
Les paramètres de defualt dépendent des paramètres que vous avez utilisés au moment de l'installation si vous avez configuré le réseau à l'aide de DHCP, puis resolv.conf pointe probablement vers votre routeur. Si vous avez configuré manuellement la mise en réseau, le serveur DNS que vous avez désigné sera le même.
Jasen
19

Bash + utilitaires GNU, 8

  • 5 octets enregistrés grâce à @Muzer.
wget to.

L'autre réponse du shell vérifie le code de retour et renvoie en conséquence une sortie d'état. C'est inutile. Le code de retour du shell est déjà un code Truthy / Falsey utilisable et accessible dans le $?paramètre idiomatique pour bash. Le code de retour 0 signifie Vrai. Code retour> 0 signifie Faux.

Utilisé:

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 numérique
la source
2
Utilisez un domaine comme to.plutôt que 8.8.8.8pour économiser beaucoup.
Muzer
@Muzer oui - merci
Digital Trauma Le
2
@Muzer Sauf s'il y a un local toque le résolveur est configuré pour trouver, il ira quand même vers le bon (et peut-être que cingler un local tosuffira-t-il à être connecté à Internet )
Christian Sievers le
2
@Muzer OK, toparfois fonctionne et parfois pas. Je suppose qu'il y a du cache. Je vais utiliser to.juste pour la sécurité.
Digital Trauma
4
Pourquoi est-ce un domaine valide?
Kos
9

Lot, 8 octets

ping to.

pingsera réglé ERRORLEVELsur 1si l'adresse ne peut pas être résolue ou atteinte.

Neil
la source
7

05AB1E , 11 9 octets

2 octets enregistrés sur "à". courtoisie de ev3commander

…to..wgX›

Vérifie si la longueur du contenu sur http: // to . est supérieur à 1.
.wrenvoie 0 en cas d'erreur.

Emigna
la source
1
Toujours un +1 pour les réponses
05AB1E
@WorseDoughnut Et pourquoi est-ce?
mbomb007
3
@ mbomb007 Vient d'être un grand fan de la langue depuis qu'Adnan a commencé à travailler dessus et l'a posté ici; c'est un langage fascinant à approfondir.
PireDoughnut
1
@WorseDoughnut Il y a déjà un hyperlien dans la réponse.
mbomb007
Ne pouvez-vous pas vous connecter à. sauvegarder un octet?
ev3commander
5

MATL , 15 14 octets

Un octet économisé grâce à la suggestion de Kevin Cruijssen

'http://to.'Xi

La sortie se fait par STDOUT. Ceci affiche une chaîne non vide contenant des caractères différents de zéro (ce qui est vrai) s'il existe une connexion Internet; et n'affiche rien (ce qui est faux) s'il n'y a pas de connexion.

Cela ne peut pas être testé en ligne car ce Xin'est pas autorisé dans les interprètes en ligne.

Explication

'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
la source
Souhaitez-vous considérer urlread('http://g.gl')comme une réponse OK par lui-même? Cela entraînera une erreur et laissera l’espace de travail vide si la connexion est interrompue. Il affichera un message d'erreur, mais techniquement c'est à STDERR ...? Je pensais que c'était un peu exagéré, donc je l'ai fait de cette façon . Mais sauter trysemble donner le même résultat que votre code, ou? Vous laissez la pile vide aussi, n'est-ce pas? Bonne réponse au fait ... :)
Stewie Griffin le
@StewieGriffin Merci! Oui, je pense que urlread('http://g.gl')c'est valide (et identique à mon code), car STDERR est ignoré par défaut et qu'un STDOUT vide est falsifié dans MATLAB
Luis Mendo le
1
cela fonctionnerait-il avec ftpau lieu de http- sauvegarder un autre octet?
Floris
1
@ Floris Ravi de vous voir aussi ici! Malheureusement ftp, semble ne pas fonctionner pour ce site
Luis Mendo
1
Bonjour @LuisMendo Oui, je rôde parfois sur d'autres sites ... Dommage que le ftp ne fonctionne pas!
Floris
5

Bash 66 62 21 octets

ping -c1 g.gl echo $?

Merci @Alex L. pour cette astuce de réduction d’URL.

Version non-golfée:

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

C’est ma première réponse dans Bash, je ne suis pas sûr d’avoir suffisamment raccourci le script.

Abel Tom
la source
Je pense que vous pouvez utiliser une URL plus courte que google.com, ce qui vous permettrait de raccourcir le code. Quelque chose comme g.gl.
HyperNeutrino
3
Vous devriez également être capable de simplement echo $?au lieu de cette déclaration entière.
SomethingDark
4
vous avez manqué "certains" ;dans la ligne de golf.
Ipor Sircer
@ IporSircer Merci. :) @SomethingDark Bonjour, affiche echo $? un 0if si il réussit, sinon il renvoie un 2dans ce cas. Je n'ai pas examiné le code source de la mise en œuvre de, pingmais je suppose, il existe différents codes de retour en fonction de la situation. Par conséquent, j'ai utilisé la if elsestratégie.
Abel Tom
@AbelTom - on pourrait soutenir que 0 est la vérité et que non-0 est Falsey.
SomethingDark
5

R, 20 octets

curl::has_internet()

Il y a une fonction pour exactement cette tâche dans le curlpaquet.

Billywob
la source
1
+1 belle trouvaille. Pour les curieux comme moi, cette fonction est implémentée comme:function() !is.null(nslookup("r-project.org", error = FALSE))
plannapus le
Nombre équivalent: httr::url_ok('g.gl')(quoique déconseillé).
Jonathan Carroll
5

Java, 72 octets

a->new java.net.InetSocketAddress("to.",80).getAddress().isReachable(9);
Huntro
la source
3
Vous devez spécifier le nom java.net.InetSocketAddress
4

Perl, 15 octets

print`curl to.`

Courir avec:

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

curlles sorties STDERR, ça ne les dérange pas. Si l'ordinateur a accès à Internet, il imprimera quelques lignes de code html (vérité), sinon, il n'imprimera rien (faux).

Sauvegardé 1 octet en utilisant to.(au lieu de mon précédent b.io) grâce à @Kevin Cruijssen.

Dada
la source
Ne pourriez-vous pas passer à bash et supprimer le print?
BlueRaja - Danny Pflughoeft le
1
@ BlueRaja-DannyPflughoeft Yup, cela fonctionnerait (il existe déjà une réponse dans bash cependant (ils utilisent wgetau lieu de, curlmais c'est la même chose)).
Dada
4

C #, 87 octets

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

Si une exception est considérée comme étant falsey, ce que je ne pense pas, il s’agit alors de 65 octets:

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

J'ai également essayé d'utiliser le lien http://to.indiqué par @KevinCruijssen, mais cela ne semblait pas fonctionner.

TheLethalCoder
la source
4

8ème , 23 21 octets

Deux octets économisés grâce à la suggestion de Kevin Cruijssen et à ma découverte:http: // semble fonctionner aussi bien quehttp: // to . (sauvegarde d'un autre octet)

"http://to" net:get .

Si le site http: // to peut être atteint, il est ensuite imprimé true. Sinon, il imprime false. Il laisse les données récupérées sur la pile.

Manoir du chaos
la source
1
TOS signifie t op o f s adhésivité. Je pense que vous voulez dire qu'il ne reste que des données sur la pile.
Roman Gräf
C'est vrai. J'ai amélioré mon explication. Merci.
Chaos Manor
@ ev3commander Avez-vous essayé avec http: // to ? Cela fonctionne dans mon cas (je vois une page par défaut Apache2 Ubuntu). Il semble qu'il n'y ait pas besoin d'annexer '.' ou '/'
Chaos Manor
3

MATLAB, 32 22 octets

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

Explication:

Si la connexion Internet est active, ansla variable par défaut sera une chaîne contenant l'intégralité du code html en texte brut (ce qui est vrai dans MATLAB).

Si la connexion Internet est en panne, un message d'erreur est écrit dans STDERR et l'espace de travail reste vide (ce qui est faux dans MATLAB).

Malheureusement, urlreadnécessite une adresse URL complète , ce g.gln'est donc pas suffisant. 11 des 22 octets ne sont donc que l'adresse URL.


Approche alternative:

Une solution qui intercepte l'erreur et laisse un 0 (également faux ) dans l'espace de travail si la connexion est interrompue:

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

0;initialise la variable par défaut ansà 0, qui se trouve falsedans MATLAB. Ensuite, nous trylisons l’url. Cela donnera une erreur si la connexion Internet est en panne, ou un tableau de caractères sinon (qui est trueen MATLAB).

Nous n'avons rien à attraper, alors nous terminons. Si l'appel urlread a abouti, ansune longue chaîne de caractères contenant le contenu du site Web sera sinon ans=0.

Stewie Griffin
la source
3

Bash, 39 octets

exec 4<>/dev/tcp/to./80&&echo 1||echo 0
GB
la source
1
! exec 4<>/dev/tcp/to./80;echo $?
Jasen
ou si vous n'avez pas besoin d'imprimer vrai / faux, mais que vous pouvez simplement le renvoyer,exec 4<>/dev/tcp/to./80
Jasen
3

JavaScript ES6, 71 43 octets

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

Alertes 1 si en ligne, alerte une chaîne vide si hors ligne. Merci à Patrick Roberts de m'aider à réduire quelques octets

Ancienne version

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

Alertes [object Reponse]si en ligne, alertes 0si hors ligne

Suppression de l'extrait de code, cela ne fonctionne pas car il se charge depuis un domaine différent sans CORS, mais cela fonctionne dans la console du navigateur.

Zanchi
la source
Hmm. Ceci affiche correctement "vrai" lorsque je suis connecté, mais n'imprime rien si je me déconnecte et que je l'exécute dans mon navigateur. Dans quel navigateur / système d'exploitation avez-vous testé cela? J'utilise chrome-win7
DJMcMayhem
@DJMcMayhem Comment va votre cache?
Ismael Miguel le
@DJMcMayhem J'ai testé sous Chrome, Win10. Cache désactivé dans l'onglet Réseau et coché Hors ligne pour le test hors ligne / en ligne
Zanchi le
Cela peut être un programme complet en 52 octets:fetch('://to.').then(a=>alert(1)).catch(a=>alert(0))
Patrick Roberts le
2

JavaScript ES6, 90 81 octets

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

JavaScript ES6, 22 21 octets (non valide)

Certains navigateurs ne prennent pas totalement en charge ou ne produisent pas le résultat attendu lorsque vous utilisez navigator.onLine.

f=a=>navigator.onLine
À M
la source
2
Cette réponse implique que cela ne retournera pas toujours faux s'il n'est pas connecté à Internet
Blue
Vous pouvez sauvegarder un octet en ajoutant un paramètre au lambda, comme f=a=>
suit
1
Bien que votre réponse semble toujours invalide, vous pouvez vous en débarrasser f=.
Mama Fun Roll
1
78 octets: a=>{with(new Image()){src="//placehold.it/1x1";onload=b=>a(1);onerror=c=>a()}}´ (got rid of f = `et utilisé with(){})
Ismael Miguel
2

Scala, 54 octets

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

Assez simple; exécute une commande ping sur http://ai./et renvoie true s'il se termine par 0 ou false sinon.

corvus_192
la source
2

Brainfuck (non-concurrent) 21 octets

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

Brainfuck ne peut pas se connecter à Internet (autant que je sache), aussi, comme le programme est incapable de se connecter, la réponse est toujours 0

Non compétitif, car il semble tomber sous la faille de la norme de sortie codée en dur , même si ce programme est techniquement correct pour le défi.

Cody
la source
Brainfuck ne peut pas se connecter, mais l'ordinateur sur lequel j'utilise cette machine peut toujours être connecté à Internet (ou non). Une solution de brainfuck appropriée est un programme qui répond toujours "je ne sais pas"
Kos
2
@Kos "Je ne sais pas" n'est pas la vérité / falsey
Restioson
Ce n'est pas "je ne sais pas", c'est "je ne peux pas, donc la réponse est non"
Cody
n'imprimez peut-être que l'octet '\ 0' car il s'agit également de 0. vous auriez un code de seulement 1 octet
12431234123412341234123
2

Powershell, 64 26 23 octets

38 octets sauvés, merci à Shawn Esterman

Sauvegardé 3 octets, et script réparé, grâce à briantist

Test-Connection -q g.gl
Horváth Dávid
la source
Test-Connection -Quiet to.
Shawn Esterman
PowerShell ne peut pas résoudre to., vous devrez utiliser à la g.glplace. De plus, vous pouvez le raccourcir Test-Connection -q g.gl.
Briantist
2

PHP, 23 PHP + Curl, 14

En utilisant l'opérateur backtick de PHP:

<?=`curl to.`;

Réponse originale:

Je vais essayer de commencer

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

Cela ne génère rien si x.gl ne peut pas être atteint et Arraysi c'est le cas.

Une autre version où je ne suis pas tout à fait sûr de savoir si ça convient:

<?=getmxrr('x.gl',$a);  // 22 chars
Christoph
la source
4
En ce qui concerne "c'est une échappatoire", je pense que le consensus normal est que cela compte comme un dialecte linguistique (la réponse est donc PHP + Curl, 15 octets ).
Est-ce qu'un tableau compte comme une vérité? Je le laisserai quand même concurrencer, puisque c'est ma question. Juste par intérêt.
Restioson
@Restioson php convertit un tableau en chaîne "Array"lorsque vous essayez de l'imprimer ( <?=) et que boolean false sera converti "". Ainsi, la valeur de retour réelle n'est pas un tableau, mais une chaîne non vide ou une chaîne vide.
Christoph le
@Cristoph Je ne pense pas que "Array" compte comme une vérité ou une erreur
Restioson
@Restioson C'est une chaîne qui convertit implicitement en boolean true. Une branche if ("Array") echo 'thruthy';serait prise donc c'est la vérité . La chaîne vide ne prendrait pas la branche et est donc falsey.
Christoph
2

Python 3 + requêtes, 59 55 53 octets

Il doit y avoir une demande de réponse, non?

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

Le statut de sortie est 0 pour Internet, 1 pour pas d'Internet. Exemple:

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

Changelog:

  • -4 octets (merci Mego)
Matsjoyce
la source
Vous pouvez raccourcir cela en utilisant un protocole différent ( ftp, peut-être) et en faisant except:0/0.
Mego
@Mego Je pense que les demandes ne font que http (s). J'ai ajouté le 0/0.
matsjoyce
1

Elixir, 33 octets

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

0 si connecté, 1 sinon.

movsx
la source
1

PowerShell , 12 octets

!!(irm g.gl)
briantiste
la source
1

Mathematica 10 octets

En supposant que vous ayez une copie valide de Mathematica et des informations de connexion sur user.wolfram.com

CloudPut@1

écrira la valeur 1 dans le nuage. Truthy: CloudObject [""] Falsey: $ a échoué

CloudGet@%

Renverra la valeur 1 qui a été téléchargée dans le nuage.

Kelly Lowder
la source
1
Notez que, par défaut, les extraits REPL ne sont pas autorisés. Mettez &ensuite pour en faire une fonction non nommée.
LegionMammal978
Pouvez-vous m'indiquer un lien?
Kelly Lowder
1
À mon avis, c'est la meilleure réponse ici. Mais l'objet Cloud compte-t-il comme une vérité? Je dirais que le 1 dans le nuage est la vérité, cependant. Bonne réponse!
Restioson
@ LegionMammal978, je peux mettre le code tel quel dans un fichier de package .wl et l'exécuter en tant que "programme" autorisé par la question d'origine. Habituellement, ce genre de questions appelle une fonction avec des entrées; aucune entrée d'utilisateur n'est nécessaire. En outre, le test de ma fonction vérité / faux fonctionne également avec ou sans le &. Dans CloudPut@1&===$Failedle & ne fait absolument aucune différence. Enfin, le programme renvoie et imprime la sortie. Il ne s’agit donc pas d’un extrait de code REPL comme vous le suggérez.
Kelly Lowder
1

Python 2.7, 70 à 77 octets

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

Utilise 1 pour la vérité, 0 pour la fausseté. a.uk redirige vers une entreprise de vêtements moto. Sauvegardé 3 octets en assignant à une variable et en l’imprimant. Et un autre pour le "à". astuce (confirmé pour travailler avec urllib), deux pour se débarrasser des empreintes embêtantes.

Chris H
la source
Je pense que from urllib import*pourrait sauver un caractère (et laisser tomber l.bien sûr).
Nick T
@ NickT J'ai oublié que vous pouviez laisser l'espace entre les deux importet *donc je pense que vous avez raison, mais je suis sur mobile et je le réparerai plus tard
Chris H
1

Julia + Bash (with dnsutils), 10 octets

run(`dig`)

`command`dans julia crée un cmdobjet qui peut être exécuté avec run.

Rɪᴋᴇʀ
la source
0

Clojure, 49 octets

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

Retourne 1s'il peut se connecter, et nilsinon.

Juste tente de slurpla page; lancer une NoRouteToHostExceptionexception en cas d'échec, ce qui est pris.

Malheureusement, le protocole et le point semblent être obligatoires.

Carcigenicate
la source
0

Javascript (Nashorn), 61 octets

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

Basé sur la réponse Java de Huntro.

SuperJedi224
la source