如果我们可以连接到某个Internet服务器,那么我们确实可以连接。但是,对于最快和最可靠的方法,所有解决方案至少应符合以下要求:避免DNS解析(我们需要一个众所周知的IP,并保证大部分时间都可用)
避免基于应用层的连接(连接到HTTP/FTP/IMAP服务)
避免从Python或其他选择的语言调用外部实用程序(我们需要想出不依赖于第三方解决方案的语言无关解决方案)
为了符合这些要求,一种方法可以是,检查是否可以访问Google's public DNS servers中的一个。这些服务器的IPv4地址是8.8.8.8和8.8.4.4。我们可以试着和他们联系。
主机8.8.8.8的快速Nmap给出了以下结果:$ sudo nmap 8.8.8.8
Starting Nmap 6.40 ( http://nmap.org ) at 2015-10-14 10:17 IST
Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
Host is up (0.0048s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
53/tcp open domain
Nmap done: 1 IP address (1 host up) scanned in 23.81 seconds
如我们所见,TCP/53是开放的,没有过滤。如果您是非根用户,请记住为Nmap使用sudo或-Pn参数来发送精心编制的探测数据包并确定主机是否已启动。
在尝试使用Python之前,让我们使用外部工具Netcat测试连接性:$ nc 8.8.8.8 53 -zv
Connection to 8.8.8.8 53 port [tcp/domain] succeeded!
Netcat确认我们可以通过TCP/53访问8.8.8.8。现在我们可以在Python中设置到8.8.8.8:53/TCP的套接字连接来检查连接:import socket
def internet(host="8.8.8.8", port=53, timeout=3):
"""
Host: 8.8.8.8 (google-public-dns-a.google.com)
OpenPort: 53/tcp
Service: domain (DNS/TCP)
"""
try:
socket.setdefaulttimeout(timeout)
socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
return True
except socket.error as ex:
print(ex)
return False
internet()
另一种方法可能是将手工编制的DNS探测发送到这些服务器之一并等待响应。但是,我想,由于数据包丢失、DNS解析失败等原因,相比之下可能会慢一些。如果您不这么认为,请评论。
更新1:由于@theamk的注释,timeout现在是一个参数,默认情况下初始化为3s。
更新#2:我做了快速测试,以确定对该问题所有有效答案的最快和最通用的实现。总结如下:$ ls *.py | sort -n | xargs -I % sh -c 'echo %; ./timeit.sh %; echo'
defos.py
True
00:00:00:00.487
iamaziz.py
True
00:00:00:00.335
ivelin.py
True
00:00:00:00.105
jaredb.py
True
00:00:00:00.533
kevinc.py
True
00:00:00:00.295
unutbu.py
True
00:00:00:00.546
7h3rAm.py
True
00:00:00:00.032
再一次:$ ls *.py | sort -n | xargs -I % sh -c 'echo %; ./timeit.sh %; echo'
defos.py
True
00:00:00:00.450
iamaziz.py
True
00:00:00:00.358
ivelin.py
True
00:00:00:00.099
jaredb.py
True
00:00:00:00.585
kevinc.py
True
00:00:00:00.492
unutbu.py
True
00:00:00:00.485
7h3rAm.py
True
00:00:00:00.035
上述输出中的True表示来自各个作者的所有这些实现都正确地标识到Internet的连接。时间以毫秒分辨率显示。
更新#3:异常处理更改后再次测试:defos.py
True
00:00:00:00.410
iamaziz.py
True
00:00:00:00.240
ivelin.py
True
00:00:00:00.109
jaredb.py
True
00:00:00:00.520
kevinc.py
True
00:00:00:00.317
unutbu.py
True
00:00:00:00.436
7h3rAm.py
True
00:00:00:00.030