I found an option discussed here which works great if the host is connected to the network. However, socket.gethostbyname(hostname)
hangs for a long time if the host is not connected.
I saw a suggestion to run socket.gethostbyname(hostname)
in a thread and if this thread did not return a result within a specified period, assume it is not connected. This I thought was a good idea, but I am not proficient enough yet with threads (although I have used them successfully) to know how to do this.
I found this discussion How to find running time of a thread in Python which seems to imply that this is not trivial. Any ideas? Thanks.
Edit:
I must admit my own ignorance. I didn't realize (though I should have) that socket.gethostbyname(hostname)
was doing a DNS lookup. So, I put together this simple to test for a socket connection to the host of interest on port 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()
Note: this will not check for an existing connection to a network and will hang if not connected.
This script will check for a connection to a network first, if a connection is found then it will check for a specific host on that network:
#! /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()