检查计算机是否连接到互联网


49

编写一个程序,根据脚本是否可以访问互联网,产生一个“ Truthy / Falsey”输出。您可以自行决定尝试连接到任何现有站点(请勿使用正常运行时间仅占10%的阴暗站点-尝试将年正常运行时间保持在80%以上)。如果网站关闭,你的程序就不会有工作。

它必须是独立程序函数。您可以使用标准库之外的库来实现此目的。禁止出现标准漏洞。这是代码高尔夫,因此字节数最短的代码获胜。

伪代码示例:

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

这是我的第一篇关于代码高尔夫的文章,因此,如果这以任何方式违反任何规则或被骗,请提醒我。

编辑:由于许多建议,我已经删除了UTF-8字节数限制


4
取而代之的truefalse,我建议允许任何我们对truthy和falsiness默认值。另外,通过Internet,您是指本地网络之外的网络吗?如果说google宕机或其他大型网站,程序是否仍必须工作?
蓝色

3
字节计数通常以该语言的本机编码或最方便的编码完成,但并不总是UTF-8。除非您有充分的理由执行UTF-8,否则我认为编码应该留给程序员选择
Luis Mendo

4
我看到几乎每个人都在使用g.gl/http://g.gl/,但是to./http://to./似乎短了一个字节(并非所有语言都将其视为有效的URL)。
凯文·克鲁伊森

9
Commodore Basic:PRINT "0"
Mark

3
从技术上讲,我在其中输入的机器是“ Internet”的一部分,因为可以从外部(通过NAT和端口转发)进行访问。因此,如果您考虑一下,“互联网检测”脚本可能会减少为“ true” :)
zeppelin

Answers:


29

Bash(使用dnsutils),3个字节

发送“。”的DNS请求。(DNS根目录),成功的退出代码为0,否则为> 0。

打高尔夫球

dig

测试

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

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

免责声明

显然,只有当您的DNS服务器位于提供商网络中,即“ Internet”(因为提供商网络通常是它的一部分),或者您的系统使用的是公共DNS服务器(例如8.8.8.8)时,这才有效。否则,您可以从本地LAN服务器(或本地主机)获取缓存的副本。

但是我认为这不违反规则,因为显然有多个系统可以按预期运行。

由于中间的缓存代理,纯HTTP方法也可能给出误报,并且不能保证在所有地方都可以使用,因此这不是该方法独有的。

一个稍微可靠的版本,8字节

dig +tra

(向@ Dig ital Tra uma 致敬!)

启用“跟踪模式”,这将强制dig自行执行递归搜索(请参阅https://serverfault.com/a/778830),从而避免任何缓存问题。


引用来源man dig:除非被告知要查询特定的名称服务器,否则dig将尝试/etc/resolv.conf中列出的每个服务器。如果未找到可用的服务器地址,dig会将查询发送到本地主机
泰特斯(Titus),

@Titus,是的,请参阅我的答案的“免责声明”部分,但是只要您的DNS服务器(在resolv.conf中指定)在提供商的一边,它就很好用。
Zeppelin

您的解决方案取决于非默认安装。我认为这是一个漏洞。您仍然可以赢得另外两个字节。
泰特斯(Titus),

1
>您的解决方案取决于非默认安装的Nope,这正是它在我的机器上的工作方式(根据Meta,这已经足够了)。而且,使用提供商的DNS服务器确实是一种非常常见的设置(通常也将在您的resolv.conf中)。
Zeppelin

2
默认设置取决于您在安装时使用的设置(如果使用DHCP配置网络),那么resolv.conf可能指向您的路由器。如果您手动配置网络,它将拥有您提名的任何DNS服务器。
Jasen

19

Bash + GNU utils,8

  • @Muzer节省了5个字节。
wget to.

另一个外壳程序回答检查返回码并相应地回显一些状态输出。这是不必要的。shell返回码已经是可用的Truthy / Falsey码,并且可以通过$?bash惯用的参数访问。返回码0表示True。返回代码> 0表示False。

正在使用:

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:~$ 

2
使用to.而不是的域名8.8.8.8可以节省很多。
Muzer

@Muzer是的-谢谢
Digital Trauma

2
@Muzer除非to配置了解析程序可找到的本地地址,否则它仍会转到正确的本地地址(也许能够ping一个本地to地址足以连接到互联网
Christian Sievers

2
@Muzer好的,to有时候可以,有时候不能。我想正在进行一些缓存。to.为了安全起见,我会使用它。
Digital Trauma

4
为什么这是一个有效的域?
科斯(Kos)

9

批处理,8个字节

ping to.

ping如果无法解析或到达该地址ERRORLEVEL1则设置为。


7

05AB1E11 9字节

在“ to”上保存了2个字节。由ev3commander提供

…to..wgX›

检查http:// to上内容的长度。大于1。
.w错误返回0。


1
始终为+1代表05AB1E答案
WorseDoughnut17年

@WorseDoughnut那为什么呢?
mbomb007 '01

3
@ mbomb007自Adnan开始致力于并将其发布到此处以来,一直是该语言的忠实拥护者;绝对是一种令人着迷的语言。
WorseDoughnut

1
@WorseDoughnut答案中已经有超链接。
mbomb007 '01

您无法连接到。保存一个字节?
ev3commander's

5

MATL15 14字节

多亏了Kevin Cruijssen的建议,节省了一个字节

'http://to.'Xi

输出通过STDOUT。如果存在Internet连接,则显示一个非空字符串,其中包含非零字符(这是事实)。如果没有连接,则不显示任何内容(虚假)。

无法在线测试,因为Xi在线解释器不允许使用。

说明

'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

您是否会认为urlread('http://g.gl')这是一个不错的答案?如果连接断开,它将出错并且将工作空间留空。它将显示错误消息,但是从技术上讲这是STDERR ...?我以为这有点麻烦,所以我就这样做了。但是跳过try似乎会得到与您的代码相同的结果,或者?您也将堆栈留空了,不是吗?顺便说一句好答案... :)
Stewie Griffin

@StewieGriffin谢谢!是的,我认为这urlread('http://g.gl')是有效的(并且与我的代码相同),因为默认情况下会忽略STDERR,而在MATLAB中则为空STDOUT是虚假的
Luis

1
可以ftp代替http-保存另一个字节吗?
Floris

1
@Floris很高兴在这里见到你!不幸的是ftp,该网站似乎不起作用
Luis Mendo

1
您好@LuisMendo是的,我有时还会浏览其他站点...太糟糕了,ftp无法正常工作!
Floris

5

Bash 66 62 21字节

ping -c1 g.gl echo $?

感谢@Alex L.提供URL缩短提示。

非高尔夫版本:

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

这是我在Bash中的第一个答案,我不确定我是否已经足够缩短脚本了。


我认为您可以使用比google.com短的URL,这样可以缩短代码。像g.gl之类的东西。
HyperNeutrino

3
您还应该能够echo $?代替整个if语句。
SomethingDark

4
您错过;了高尔夫比赛中的“一些” 。
Ipor Sircer '17

@IporSircer谢谢。:) @SomethingDark您好,如果成功,则echo $? 打印0,否则返回2。我没有研究过实现的源代码,ping但我假设,根据状态有不同的返回码。因此,我使用了if else策略。
亚伯汤姆

@AbelTom-可以说0为真,非0为假。
SomethingDark

5

R,20个字节

curl::has_internet()

包中确实有一项功能可以完成此任务curl


1
+1个不错的发现。对于像我这样的好奇者,此功能的实现方式为:function() !is.null(nslookup("r-project.org", error = FALSE))
plannapus

等效计数:(httr::url_ok('g.gl')尽管已弃用)。
乔纳森·卡罗尔

5

Java,72个字节

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

3
您需要指定全限定名java.net.InetSocketAddress

4

Perl,15个字节

print`curl to.`

运行:

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

curl在上输出内容STDERR,不要介意。如果计算机可以访问Internet,它将打印几行html(真实),否则,将不打印任何内容(虚假)。

感谢@Kevin Cruijssen,通过使用to.(而不是之前的b.io)节省了1个字节。


您不能切换到bash并删除print吗?
BlueRaja-Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft是的,这行得通(尽管bash中已经有一个答案(使用wget代替而不是curl它是同一回事))。
达达

4

C#,87个字节

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

如果异常被认为是错误的,我认为不是,那么这是65个字节:

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

我也尝试使用http://to.@KevinCruijssen 所述的链接,但它似乎没有用。


4

8th23 21字节

感谢凯文·克鲁伊森的建议和我的发现,节省了两个字节http:// to似乎同样有效http:// to。(保存另一个字节)

"http://to" net:get .

如果可以访问站点http:// to,则将打印true。否则它将打印false。它将检索到的数据留在堆栈上。


1
TOS装置运算ö ˚F 小号粘性。我认为您的意思是只将数据留在堆栈上。
罗曼·格拉夫(RomanGräf)

那就对了。我改善了解释。谢谢。
混沌庄园

@ ev3commander您是否尝试过http:// to?就我而言,它可以工作(我看到一个Apache2 Ubuntu默认页面)。似乎不需要附加“。”。或'/'
Chaos Manor

3

MATLAB,32 22字节

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

说明:

如果互联网连接正常,这将导致ans(默认变量)是一个字符串,其中的整个html代码为纯文本格式(在MATLAB 中为true)。

如果Internet连接断开,这将向STDERR写一条错误消息,并使工作空间为空(在MATLAB 中为false)。

不幸的是,urlread需要完整的url-address,所以g.gl还不够。因此,22个字节中的11个只是url地址。


替代方法:

解决此错误的解决方案,如果连接断开,则在工作区中保留0(也为false):

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

0;将默认变量初始化ans0,这false在MATLAB中。然后,我们try阅读网址。如果互联网连接断开,这将产生错误,否则,将导致一个字符数组(这true在MATLAB中)。

我们不需要抓任何东西,所以我们就结束了。如果urlread调用成功,ans则将是包含网站内容的长字符串,否则为ans=0


3

Bash,39个字节

exec 4<>/dev/tcp/to./80&&echo 1||echo 0

1
! exec 4<>/dev/tcp/to./80;echo $?
杰森

还是如果您不需要打印true / false但可以将其返回,exec 4<>/dev/tcp/to./80
Jasen

3

JavaScript ES6,71 43个字节

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

如果在线,则警报1,如果离线,则警报一个空字符串。感谢Patrick Roberts帮助我节省了一些字节

旧版本

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

警报[object Reponse]如果在网上,提醒0如果离线

删除了代码段,该代码段不起作用,因为它是从没有CORS的其他域中加载的,但是可以在浏览器控制台中使用


嗯 当我连接时,这将正确打印“ true”,但是如果我断开连接并在浏览器中运行它,则不会打印任何内容。您在哪个浏览器/ OS中进行了测试?我正在使用chrome-win7
DJMcMayhem

@DJMcMayhem您的缓存如何?
伊斯梅尔·米格尔

@DJMcMayhem我在Chrome Win10中测试过。从“网络”标签中禁用了缓存,并选中了“脱机”以测试脱机/在线状态
Zanchi

这可以是52字节的完整程序:fetch('://to.').then(a=>alert(1)).catch(a=>alert(0))
Patrick Roberts

2

JavaScript的ES6,90个 81字节

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

的JavaScript ES6,22 21个字节(无效的)

某些浏览器在使用navigator.onLine时不完全支持或产生预期的结果。

f=a=>navigator.onLine

2
这个答案暗示着,当未连接到互联网时,它不会总是返回false
Blue

您可以通过向lambda添加参数来保存字节,如下所示:f=a=>
XavCo7

1
尽管您的答案似乎仍然无效,但是您可以摆脱它f=
Mama Fun Roll

1
78字节:a=>{with(new Image()){src="//placehold.it/1x1";onload=b=>a(1);onerror=c=>a()}}´ (got rid of f =`并使用with(){}
Ismael Miguel

2

Scala,54个字节

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

很简单;对执行ping命令http://ai./,如果以0退出则返回true,否则返回false。


2

Brainfuck(非竞争)21字节

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

Brainfuck无法连接到互联网(据我所知),因此,由于该程序无法连接,因此答案始终是 0

不竞争,因为它似乎属于硬编码输出标准漏洞,即使该程序在技术上对挑战是正确的。


Brainfuck无法连接,但是我正在运行此功能的计算机仍可以连接到Internet(或不可以)。正确的解决方案是始终响应“我不知道”的程序
Kos

2
@Kos“我不知道”不是真实的/错误的
-Restioson

这不是“我不知道”,而是“我不能因此答案是否定的”
Cody

也许只打印字节“ \ 0”,因为它也为0。您将只有一个字节的代码
12431234123412341234123 '17年

2

Powershell,64 26 23字节

感谢Shawn Esterman,节省了38个字节

感谢briantist,节省了3个字节并修复了脚本

Test-Connection -q g.gl

测试连接-安静到。
Shawn Esterman

PowerShell无法解析to.,您必须使用g.gl。此外,您可以将其缩短为Test-Connection -q g.gl
briantist

2

PHP,23 PHP + Curl,14

使用PHP的反引号运算符:

<?=`curl to.`;

原始答案:

我将尝试开始:

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

如果无法到达x.gl,则不会输出任何Array内容。

我不确定是否适合的另一个版本:

<?=getmxrr('x.gl',$a);  // 22 chars

4
关于“是一个漏洞”,我认为通常的共识是它可以算作一种语言方言(因此答案是PHP + Curl,15个字节)。

数组算作真实吗?我还是要允许它竞争,因为这是我的问题。只是出于兴趣。
Restioson

@Restioson php "Array"在您尝试打印数组时将数组转换为字符串(<?=),布尔值false将转换为""。因此,实际的返回值不是数组,而是非空字符串或空字符串。
克里斯多夫(Christoph)

@克里斯托弗,我认为“数组”不算是对还是错
-Restioson

@Restioson这是一个隐式转换为布尔值true的字符串。if ("Array") echo 'thruthy';将会采取分支行动,因此这是事实。空字符串不会进入分支,因此为false。
克里斯多夫(Christoph)

2

Python 3 +请求,59 55 53字节

必须有一个请求答案,对不对?

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

互联网的退出状态为0,没有互联网的退出状态为1。例:

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

变更日志:

  • -4个字节(感谢Mego)

您可以通过使用其他协议(ftp也许)并执行来缩短此时间except:0/0
Mego

@Mego我认为请求仅适用于http(s)。我添加了0/0。
matsjoyce

1

Elixir,33个字节

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

如果已连接,则为0,否则为1。



1

Mathematica 10字节

假设您拥有有效的Mathematica副本,并在user.wolfram.com上登录了凭据

CloudPut@1

会将值1写入云端。Truthy:CloudObject [“”]错误:$ Failed

CloudGet@%

将返回上载到云的值1。


1
请注意,默认情况下,不允许使用REPL代码段。把&事后将它做成一个匿名函数。
LegionMammal978

你能指出我一个链接吗?
凯利·洛德


1
我认为这是最好的答案。但是云对象算不算真的吗?我会说,云计算中的1是真实的。好答案!
Restioson

@ LegionMammal978,我可以按原样将代码放在.wl包文件中,并按照原始问题的要求将其作为“程序”运行。通常,这类问题要求带有输入的函数。无需用户输入。此外,无论是否使用&,将我的true / false作为函数进行测试的效果都一样。在CloudPut@1&===$Failed&绝对没有区别。最后,该程序既返回并打印输出,因此实际上并不是您建议的REPL代码段。
凯莉·洛德

1

Python 2.7、70 77字节

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

使用1表示真实,使用0表示虚假。a.uk重定向到摩托车服装公司。通过分配给变量并打印可以节省3个字节。另一个为“至”。技巧(已确认可与urllib配合使用),其中两个技巧是摆脱讨厌的缩进。


我认为from urllib import*可以节省一个字符(l.当然也可以保存)。
尼克T

@NickT我忘记了您可以在两者之间留出空间import*所以我认为您是对的,但是我在移动设备上,稍后再解决
Chris H

1

朱莉娅+巴什(与dnsutils),10字节

run(`dig`)

`command`在julia中创建一个cmd可以与一起运行的对象run


0

Clojure,49个字节

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

返回1是否可以连接,nil否则返回。

只是尝试到slurp页面;抛出一个NoRouteToHostException失败的例外,它被捕获。

不幸的是,协议和点似乎是强制性的。


0

Javascript(Nashorn),61个字节

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

基于Huntro的Java答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.