python检查网络连接_检查网络连接

如果我们可以连接到某个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值