Test if an internet connection is present in python
Solution 1:
My approach would be something like this:
import socket
REMOTE_SERVER = "one.one.one.one"
def is_connected(hostname):
try:
# see if we can resolve the host name -- tells us if there is
# a DNS listening
host = socket.gethostbyname(hostname)
# connect to the host -- tells us if the host is actually
# reachable
s = socket.create_connection((host, 80), 2)
s.close()
return True
except:
pass
return False
%timeit is_connected(REMOTE_SERVER)
> 10 loops, best of 3: 42.2 ms per loop
This will return within less than a second if there is no connection (OSX, Python 2.7).
Note: This test can return false positives -- e.g. the DNS lookup may return a server within the local network. To be really sure you are connected to the internet, and talking to a valid host, be sure to use more sophisticated methods (e.g. SSL).
Solution 2:
As of Python 2.6 and newer (including Python 3), a more straightforward solution which is also compatible with IPv6 would be
import socket
def is_connected():
try:
# connect to the host -- tells us if the host is actually
# reachable
socket.create_connection(("1.1.1.1", 53))
return True
except OSError:
pass
return False
It resolves the name and tries to connect to each return addres before concluding it is offline. This also includes IPv6 addresses.
Solution 3:
Efficient way to check internet availability (modified @andrebrait's answer).
import socket
def isConnected():
try:
# connect to the host -- tells us if the host is actually
# reachable
sock = socket.create_connection(("www.google.com", 80))
if sock is not None:
print('Clossing socket')
sock.close
return True
except OSError:
pass
return False