How to detect if my WiFi is enabled or not with Python? [duplicate]
I have the following code that checks if an internet connection is present.
import urllib2
def internet_on():
try:
response=urllib2.urlopen('http://74.125.228.100',timeout=20)
return True
except urllib2.URLError as err: pass
return False
This will test for an internet connection, but how effective is it?
I know internet varies in quality from person to person, so I'm looking for something that is most effective for the broad spectrum, and the above code seems like there might be loopholes where people could find bugs. For instance if someone just had a really slow connection, and took longer than 20 seconds to respond.
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).
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.
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
I have been using this for a while now, works fine
import requests
while True:
try:
requests.get('https://www.google.com/').status_code
break
except:
time.sleep(5)
pass