Como saber se conectado à internet
Pergunta
Desejo escrever um aplicativo Windows que faça algo quando fico desconectado da Internet. Eu estava pensando em escrever um aplicativo C#/Delphi muito simples, que simplesmente faz pesquisas a cada 20 segundos para ver se ainda estou conectado.
Se eu tiver que pesquisar, eu realmente gostaria de uma solução além de tentar baixar uma página da web da rede. Não posso assumir que uma tentativa de download de falhar significa "não online", pois pode haver outros aplicativos consumindo a largura de banda da Internet. Além disso, tenho certeza de que constantemente conectar/baixar de um site específico vai bloquear meu IP.
Tenho certeza que há um Maneira de saber se você está online sem baixar/conectar a um servidor remoto Mas não tenho certeza de como.
Solução
Cuidado que conectado à Internet realmente não significa nada: e se você estiver conectado ao seu ISP, mas a espinha dorsal está baixa ou todos os sites que você deseja acessar estão em um país que saiu da grade como recentemente? Ter uma conexão não significa que você pode fazer o que deseja.
Enfim, como afirmado antes de usar o InternetGetConnectedState
API para testar que você tem uma conexão com a Internet válida configurada.
Como exemplo, a rotina a seguir me disse corretamente que eu tinha uma conexão LAN, mas não consegui detectar que eu tinha meu firewall zonealarm definido para bloquear "toda a atividade da Internet", o que significa que você perdeu efetivamente toda a conectividade da Internet.
Rotina Delphi:
procedure IsConnected;
var
dwFlags: DWORD;
begin
if InternetGetConnectedState(@dwFlags, 0) then
begin
if (dwFlags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then
ShowMessage('Modem Connection')
else
if (dwFlags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then
ShowMessage('LAN Connection')
else
if (dwFlags and INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY then
ShowMessage('Connection thru Proxy')
else
if (dwFlags and INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE then
ShowMessage('Local system in offline mode')
else
if (dwFlags and INTERNET_CONNECTION_CONFIGURED) = INTERNET_CONNECTION_CONFIGURED then
ShowMessage('Valid connection exists, but might or might not be connected')
end
else
ShowMessage('Not Connected. Try to connect and risk of being prompted to dial into another Internet Service Provider.');
end;
Outras dicas
Ligar para InternetGetConnectedState
função. este Artigo da Base do Conhecimento explica como fazer isso.
Parece que pode ser feito usando o método descrito aqui: http://www.csharphelp.com/archives3/archive499.html