Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Detecting if internet connection is active at this moment.

1 view
Skip to first unread message

Doug Crane

unread,
May 3, 2001, 3:11:04 PM5/3/01
to
How can I quickly detect if someone is connected to the internet at this moment?
I tried the code below on my own machine. I seem to get the same return values
whether my LAN connection is plugged in or not, and whether my DHCP address has
expired or not.

Ideally, this call (or sequence of calls) will be fairly instantaneous if they do
have a live internet connection. If they are not connected then I would hope that
the call would also be fast (less than 10-15 seconds).

What I really want to know is:
- If they have a dial-up connection, are they connected right now?
- If they have a connection via their LAN, are they plugged in and
connected right now?

Note: I program in C (not C++ or MFC).

*********************************************************************
HINTERNET hi, hi1;
DWORD error, ConnectionType;
int ret;

hi=InternetOpen( "the launcher", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL,
INTERNET_FLAG_ASYNC );
error=GetLastError();

hi1=InternetConnect( hi, hostName, INTERNET_DEFAULT_HTTP_PORT , "", "",
INTERNET_SERVICE_HTTP, 0, 0);

ret=InternetCheckConnection(hostName, FLAG_ICC_FORCE_CONNECTION, 0);
ret=InternetGetConnectedState(&ConnectionType, 0);
*********************************************************************

Allen Weng

unread,
May 4, 2001, 2:26:52 AM5/4/01
to
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.

Allen Weng
Microsoft Developer Support

Mathos

unread,
Jun 19, 2001, 8:36:39 AM6/19/01
to
This is how I manage to detect if there is a connexion to the internet. I
use a regitry key :

bool DetectConnexion (){
file://return true;
__int16 buff=0;
bool retour;
int temp;

TRegistry *Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE;
if (Reg->OpenKey("System\\CurrentControlSet\\Services\\RemoteAccess",
false)){
Reg->ReadBinaryData("Remote Connection",&buff,16);
Reg->CloseKey();
}
}
__finally {

delete Reg;

if (buff == 1) {
retour = true;
}else {
retour = false;
}
return(retour);
}
}

this could work.

Doug Crane <dcr...@dyned.com> a écrit dans le message :
348601c0d404$ccf26810$a5e62ecf@tkmsftngxa07...

Mathos

unread,
Jun 19, 2001, 8:39:29 AM6/19/01
to
This is how I manage to detect if there is a connexion to the internet. I
use a regitry key :

bool DetectConnexion (){
file://return true;
__int16 buff=0;
bool retour;
int temp;

TRegistry *Reg = new TRegistry;
try
{
Reg->RootKey = HKEY_LOCAL_MACHINE;
if (Reg->OpenKey("System\\CurrentControlSet\\Services\\RemoteAccess",
false)){
Reg->ReadBinaryData("Remote Connection",&buff,16);
Reg->CloseKey();
}
}
__finally {

delete Reg;

if (buff == 1) {
retour = true;
}else {
retour = false;
}
return(retour);
}
}

this could work.

Doug Crane <dcr...@dyned.com> a écrit dans le message :
348601c0d404$ccf26810$a5e62ecf@tkmsftngxa07...

0 new messages