我发现这里讨论的一个选项在主机连接到网络时效果很好。但是,socket.gethostbyname(hostname)
如果主机未连接,则会挂起很长时间。
我看到一个建议socket.gethostbyname(hostname)
在线程中运行,如果该线程在指定时间内没有返回结果,则假设它没有连接。我认为这是一个好主意,但是我对线程的熟练程度还不够(尽管我已经成功地使用了它们)知道如何做到这一点。
我发现了这个讨论如何在 Python 中找到线程的运行时间,这似乎暗示这不是微不足道的。有任何想法吗?谢谢。
编辑:
我必须承认我自己的无知。我没有意识到(尽管我应该知道)这socket.gethostbyname(hostname)
是在进行 DNS 查找。所以,我把这个简单的东西放在一起来测试到端口 22 上感兴趣的主机的套接字连接:
#! /usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.5)
try:
s.connect(('192.168.2.5',22))
except Exception, e:
print 'connection failed'
s.close()
注意:这不会检查与网络的现有连接,如果未连接,则会挂起。
此脚本将首先检查与网络的连接,如果找到连接,则它将检查该网络上的特定主机:
#! /usr/bin/python
import socket
import fcntl
import struct
def check_connection():
ifaces = ['eth0','wlan0']
connected = []
i = 0
for ifname in ifaces:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
connected.append(ifname)
print "%s is connected" % ifname
except:
print "%s is not connected" % ifname
i += 1
return connected
connected_ifaces = check_connection()
if len(connected_ifaces) == 0:
print 'not connected to any network'
else:
print 'connected to a network using the following interface(s):'
for x in connected_ifaces:
print '\t%s' % x
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.5)
try:
s.connect(('192.168.2.5',22))
print 'connected to hostname'
except Exception, e:
print 'connection to hostname failed'
s.close()