BOOL IsInternetConnected()

Alot of times, programming internet applications you need to know wether the computer is connected to the internet?

In some occasions you can try to use RasEnumConnections, in most cases on a typical computer opened Ras Connection mean that the user is connected to the internet. However, this idea won't work in case the user is connected to internet not via Ras device or is connected to some kind of local network.

We try to use common sence here. Since internet is something abstract, lets decide that user which is connected to internet, is the one who can connect to www.microsoft.com.

First I wanted to use ping, but found a lot of troubles with it. Therefore, I have decided to use sockets "directly". I didn't want to write some fance code here, rather I have wrote a simple function you can cut & paste into your application.

Another problem adressed in the function that in some computer a try to establish internet connection will bring dialup dialog. The function solve it by temporary disabling the feature in the registry and enabling it back afterwards.

Pay attention to the comments.


BOOL YourClassHere::IsInternetConnected (void)
{
 int nCheck = AfxSocketInit();
 CSocket m_Server;
 HKEY hKey;
 DWORD dwDial, dwDialType = REG_DWORD, dwDialSize = 4;
 DWORD dwNew = 0;
 BOOL bResult = true;
 
 if ( RegOpenKeyEx ( HKEY_CURRENT_USER,
    Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
     0, KEY_SET_VALUE, &hKey) != ERROR_SUCCESS)
    ; // We cannot find the key. Handle this situation or just continue
                                                
 if ( RegQueryValueEx( hKey, "EnableAutodial", NULL, &dwDialType,
  (BYTE *) &dwDial, &dwDialSize ) != ERROR_SUCCESS )
  ; // We cannot find the value. Handle it.

 if ( dwDial ) { // We need to change the value, in order to make
            // a dialup window not to show up.
  
  if ( (nCheck = RegSetValueEx( hKey, "EnableAutodial", NULL,
   dwDialType, (BYTE *) &dwNew, dwDialSize )) != ERROR_SUCCESS)
  ; // Failed? We shouldn't get here. You decide how to handle it
 }
  
 
 if ( !m_Server.Create() ) {                                                       
        // m_sError = _T( "Unable to create the socket." );
        bResult = false;
 }   

// You can use www.microsoft.com in order to check whether DNS is available
// or numeric IP otherwise 
 else if ( !m_Server.Connect( "www.microsoft.com", 80 ) ) {     //  207.46.130.150
        //m_sError = _T( "Unable to connect to server" );        
        m_Server.Close();
        bResult = false;
 }
 
 
 if ( dwDial ) {
  if ( (nCheck = RegSetValueEx( hKey, "EnableAutodial", NULL,
   dwDialType, (BYTE *) &dwDial, dwDialSize )) != ERROR_SUCCESS)
  ; // Failed? We shouldn't get it. You decide how to handle this.
 }
 
 RegCloseKey( hKey );
 return ( bResult );
}

I would like to thank Martin Tschepe for pointing me out this registry key.

Download source - 2KB

History



Comments

  • Nike Current Max 1 FB release, father a eager color grain, the chic shoes

    Posted by Geozyoceada on 04/19/2013 05:02am

    In the summer in a tumbler interior the cool sprite seems to be a decorous choice, but if the sprite "feet"? Resolution also supply you a set off, bring a invigorating! This summer, Nike and Sprite [url=http://northernroofing.co.uk/roofins.cfm]nike free run uk[/url] and his sneakers to a commingling of classic snow spread of unripened, white and indecent color scheme in the definitive Nike Superciliousness Max 1 shoes let it be known a refreshing cool scent.[url=http://northernroofing.co.uk/roofins.cfm]nike free run uk[/url] Summer is the yet to select a cleanly shoe, shoes should be a obedient choice. Qualifying series Nike Publicize Max HomeTurf metropolis recently lastly comes up, this series in the classic Breath Max shoes to London, Paris and Milan the three paid glorification to the iconic megalopolis of Europe, combined with the characteristics of the three cities, Sense Max 1 HYP,Allied Max 90 HYP,Show Max 1 and shoes such as Make public Max 95, combined [url=http://northernroofing.co.uk/roofins.cfm]nike free run uk[/url] with the Hyperfuse, as well as a heterogeneity of materials, such as suede, Whether you crave going or retro-everything.

    Reply
  • prXujV Xr RE GOi RgfQ JS

    Posted by UpSwmXwvss on 11/02/2012 02:01pm

    klonopin price klonopin dosage weight - klonopin side effects and breastfeeding

    Reply
  • An easier alternative

    Posted by Legacy on 08/11/2003 12:00am

    Originally posted by: Patrick Philippot

    Hi,
    
    

    Edwin Eefting made a clever comment about using the IP
    routing table to detect a connection. I have implemented
    this brillant idea and I have to say that this is actually
    a very interesting solution.

    Basically, you just look at the system IP routing table and
    check whether an entry exists for a default gateway
    (0.0.0.0). If yes, the system either has an active dial-up
    connection or is connected via LAN, DSL or cable. As soon
    as the dial-up connection is broken, the default gateway
    entry disappears from the IP routing table.

    This doesn't guarantee that any request will succeed (the
    cable may be unplugged or the user may have logged off from
    the ISP) but you can check this afterwards, **the main
    interest of this approach being that is doesn't trigger any
    autodial process**. If the function below returns FALSE,
    you will not even try to access the Internet: you know that
    any request will fail anyway. If it returns TRUE, you can
    safely make a connection attempt without incurring the risk
    of triggering an autodial. You will possibly get an error
    when using WinInet or any socket function.

    Here's a sample routine:

    #include <iphlpapi.h>
    ...

    BOOL YourClass::CheckConnection()
    {
    MIB_IPFORWARDTABLE* pft;
    DWORD dwTableSize = 0;
    BOOL bHasDefaultRoute = FALSE;

    GetIpForwardTable(NULL, &dwTableSize, FALSE);
    pft = (MIB_IPFORWARDTABLE*) new BYTE[dwTableSize];

    if (GetIpForwardTable(pft,
    &dwTableSize,
    TRUE) == NO_ERROR)
    {
    for (unsigned int nIndex = 0;
    nIndex < pft->dwNumEntries;
    nIndex++)
    {
    if (pft->table[nIndex].dwForwardDest == 0)
    // Default route to gateway
    {
    bHasDefaultRoute = TRUE;
    break;
    }
    }
    }

    delete pft;

    return bHasDefaultRoute;
    }

    Note that your system must support the IPHLPAPI, which is
    not the case for Win95 and Windows NT 4 pre-SP4.

    This code has been tested on various configurations from
    Win98 to XP) and it worked fine each time.

    Hope this helps.

    --Patrick Philippot
    Microsoft MVP [.Net]
    Consulting Services
    www.mainsoft.fr

    • Absolutely Brilliant

      Posted by bob16972 on 03/26/2005 06:19pm

      Your solution should have been included in "Visual C++ Goodies" instead of "Function To Verify if Connected to the internet" methinks. Too bad the book came out first. Thanks Patrick (and Edwin) for sharing it

      Reply
    • Thanks

      Posted by skjacob on 02/11/2005 01:06am

      Ur solution works perfectly

      Reply
    Reply
  • Winsock Proxy handling

    Posted by Legacy on 01/20/2003 12:00am

    Originally posted by: Eugene Polonsky

    Using Winsock to check connection status--has anyone run into any issues regarding proxy server settings when attempting to verify connection?

    Reply
  • Error Message when use the function "InetIsOffline"

    Posted by Legacy on 04/02/2002 12:00am

    Originally posted by: Maverick

    Dear all:
    
    

    I need some one can help to slove this problem .
    "error LNK2001 :unresolved external symble __imp__InetIsOffline@4"

    I add one code "#include <intshcut.h> but my program still
    can not link with VC ++ 6.0.

    thanks the guy that can help me.

    • Reply for Error Message when use the function "InetIsOffline"

      Posted by skjacob on 02/11/2005 12:59am

      Add url.lib to ur settings\Link tab

      Reply
    Reply
  • Error in WININET.H

    Posted by Legacy on 12/27/2001 12:00am

    Originally posted by: Rey

    When I compile wininet.h I get an error with LPVOID, can anyone help?

    Reply
  • detecting internet status in VJ++

    Posted by Legacy on 11/13/2001 12:00am

    Originally posted by: Priyanka

    Hey, 
    
    

    I saw all the methods that u guys had suggested for finding out there is an active internet connection but wanted to know if anything similar is available in VJ++.

    Any help would be appreciated!!

    thnx,

    Priyanka

    Reply
  • Windows ME?

    Posted by Legacy on 09/30/2001 12:00am

    Originally posted by: Phil Hord

    I've heard from a user that autodial is erroneously triggered on Windows ME. Does anyone have any info on WinME registry settings to disable AutoDial?

    Reply
  • No existe el archivo

    Posted by Legacy on 08/08/2001 12:00am

    Originally posted by: V�ctor Lema

    no 'ta el archivo .zip

    Reply
  • Fix for the long delay

    Posted by Legacy on 07/24/2001 12:00am

    Originally posted by: Rob Adamson

    There seems to be a problem in the gethostbyname because I could not find a way to shorten the connection timeout.  30 seconds or more is way too long for most users.  I finally resorted to threads to make this work with a 5 second timeout.
    
    

    DWORD WINAPI ConnectThreadProc(LPVOID lpResult)
    {
    BOOL* lpbResult = (BOOL*) lpResult;

    *lpbResult = IsInternetConnected();
    return 0;
    }

    BOOL mfIsInternetConnected()
    {
    BOOL bResult = FALSE;
    DWORD dwThreadId = 0;

    BOOL bInternetConnected = FALSE;
    HANDLE hConThread = CreateThread(NULL, 0, ConnectThreadProc, &bInternetConnected, 0, &dwThreadId);

    if (WaitForSingleObject(hConThread, 5000) == WAIT_TIMEOUT)
    {
    TerminateThread(hConThread, 0);
    }
    return (bInternetConnected);
    }

    Reply
  • Loading, Please Wait ...

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: September 16, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you starting an on-premise-to-cloud data migration project? Have you thought about how much space you might need for your online platform or how to handle data that might be related to users who no longer exist? If these questions or any other concerns have been plaguing you about your migration project, check out this eSeminar. Join our speakers Betsy Bilhorn, VP, Product Management at Scribe, Mike Virnig, PowerSucess Manager and Michele …

  • This ESG study by Mark Peters evaluated a common industry-standard disk VTl deduplication system (with 15:1 reduction ratio) versus a tape library with LTO-5, drives with full nightly backups, over a five-year period.  The scenarios included replicated systems and offsite tape vaults.  In all circumstances, the TCO for VTL with deduplication ranged from about 2 to 4 times more expensive than the LTO-5 tape library TCO. The paper shares recent ESG research and lots more. 

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds