Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Test if an internet connection is present in python

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.

like image 213
Joshua Strot Avatar asked Jan 03 '14 21:01

Joshua Strot


2 Answers

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).

like image 171
miraculixx Avatar answered Sep 20 '22 13:09

miraculixx


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.

like image 32
andrebrait Avatar answered Sep 20 '22 13:09

andrebrait