From http://www.iseran.com/Win32/FAQ/section6.html#106:
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 :-
IsNetworkAlive() If you are targeting systems
with IE5 an 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.
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 "RasEnumConnectionsA" from
"RASAPI32.DLL", as LAN installations of Windows may not include the library.
InternetGetConnectedState() This a 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 off line flag changed for IE5 -it returns TRUE for connected' even when
off line, but signals the flag in the LPDWORD parameter.
InternetCheckConnection() A Wininet/IE4
function call. This is meant to determine if a URL is reachable -in practice it
is pretty unreliable and best avoided.
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 new function calls
WM_DEVICECHANGE messages, which tell your app when a slow or fast network
adapter has arrived or departed. There is no way to tell if the adapters are
actually connected to anything though.
NT4 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. 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.
|
Windows API
|
1/27/2002 3:54 PM
jcohen
(Modified 2/3/2003 3:03 PM)
|
New Window
Move/Edit
|