Detect Internet Connection

Actually, there is no single function for determining if a machine is  connected to the Internet, and it is impossible to reliably determine what  is happening without side effects - such as automatic network connections  taking place. What you can do is reliably detect when there definitely  isn't an Internet Link: in the absence of any dial up or LAN connection the  system is definitely off line.   
Some techniques include:  
1. IsNetworkAlive() If you are targeting system with IE5 or later, this is the best API call  yet it even listens for traffic on a LAN. There is a secondary function  IsDestinationReachable() which tries to resolve the hostname and ping it.  This does not work through firewalls, and overestimates speed as the max  the LAN card can support, rather than the actual point to point bandwidth.  
2. RasEnumConnections() A reliable technique for modems and direct dial up networking, but not for  situations where Internet access is via a LAN. You should dynamically load  "RasEnumConnectionA" from "RASAPI32.DLL", as LAN installations of Windows  may not include the library.  
3. InternetGetConnectedState() This Wininet /IE4 function call can distinguish between modem and LAN, but  can't handle complex LAN+autodial router situations. It is "offline state  aware". Important: handling of the offline flage changed for IE5 -it  returns TRUE for connected'  even when off line, but signals the flags in  the LPDWORD parameter.  
4. InternetCheckConnection() A Winnet/IE4 function call. This is meant to determine if a URL is  reachable- in practice it is pretty unreliable and best voided.  
5. NT SP4, NT5: The IP helper API can tell you which network interface to  use to connect to a supplied IP address, and what the bandwidth and current  status of that link is  
6. Using the Offline flag which is part of IE4 to allow users to manually  control the online/offline state of applications. This flag is stored in  the registry and can be manipulated via some funcions calls  These calls mostly determine the presence or absence of network connections  -not Internet access, so can't handle a home network sharing a dial up  connection, or two laptops connected directly to each other.   The global offline state flag of IE4 (and hence win98, NT5) and the call to  test it - InternetGetConnectedState()- look the best long term options, but  will take time to become universal. The IP Helper APIs even let you find  out how much traffic is going over a link, but only detect the 'loopback'  interface on Windows 98, so is not a lot of use. Wouldn't a  'GetSpeedToHost() function call be great?   
Finally, whatever technique you use, when it's time to talk to a remote  site, always add timeouts or a cancel button. Even a quick functions like  gethostbyname() can lock up an app if something in the network chain is  broken.  

ref:
How to test the reachability of a VPN-Connection? - http://www.codeproject.com/KB/IP/SimpleLineTester.aspx