判断网络地址是否可达

来源:百度文库 编辑:神马文学网 时间:2024/04/28 16:18:48

一个windows下的ping程序

http://www.codeproject.com/internet/winping.asp

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.  

Best   regards,
yhhuang
VS.NET,   Visual   C++
Microsoft