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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With