Я нашел интересующую вас опцию here, которая отлично работает, если хост подключен к сети. Однако socket.gethostbyname(hostname)
долгое время зависает, если хост не подключен.Проверка python, чтобы узнать, подключен ли хост к сети
Я видел предложение запустить socket.gethostbyname(hostname)
в потоке, и если этот поток не вернул результат в течение определенного периода, предположим, что он не подключен. Я подумал, что это хорошая идея, но я недостаточно разбираюсь в потоках (хотя я использовал их успешно), чтобы знать, как это сделать.
Я нашел эту дискуссию How to find running time of a thread in Python, которая, по-видимому, подразумевает, что это не тривиально. Есть идеи? Благодарю.
Edit:
Я должен признать свое собственное невежество. Я не понял (хотя должен был), что 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()
http://stackoverflow.com/questions/3764291/checking-network-connection – NPE
@NPE благодарит за идею. Мне нравится параметр тайм-аута в urllib2.urlopen, но мне кажется, вам нужно, чтобы на этом хосте работал веб-сервер, чтобы это работать, чего у меня нет. – nomadicME
В тех случаях, когда доступ к сети возможен, но DNS-сервер отсутствует, вы хотите пройти или провалиться? Если ответ «pass» или «do not care», вы можете поместить тайм-аут на «connect» на IP-адрес гораздо проще, чем на поиск DNS. Если ответ «сбой» (и вы не заботитесь о том, чтобы различать случаи), вам нужно сделать что-то сложное, как вы предлагаете. – abarnert