verificar se a conexão com a Internet está disponível com c #

Qual é a maneira mais fácil de verificar se a conexão com a Internet está disponível de forma programática?

EDIT: Como sugerido, tentei usar o seguinte método, mas está sempre retornando verdadeiro.

[Flags] enum InternetConnectionState : int { INTERNET_CONNECTION_MODEM = 0x1, INTERNET_CONNECTION_LAN = 0x2, INTERNET_CONNECTION_PROXY = 0x4, INTERNET_RAS_INSTALLED = 0x10, INTERNET_CONNECTION_OFFLINE = 0x20, INTERNET_CONNECTION_CONFIGURED = 0x40 } class Program { [DllImport("WININET", CharSet = CharSet.Auto)] static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved); static void Main(string[] args) { InternetConnectionState flags = 0; bool isConnected = InternetGetConnectedState(ref flags, 0); Console.WriteLine(isConnected); //Console.WriteLine(flags); Console.ReadKey(); } } 

Informações adicionais (se ajudar): access a internet através de uma rede wifi compartilhada.

Aqui está a API do Windows na qual você pode ligar. Está em wininet.dll e chamado InternetGetConnectedState .

 using System; using System.Runtime; using System.Runtime.InteropServices; public class InternetCS { //Creating the extern function... [DllImport("wininet.dll")] private extern static bool InternetGetConnectedState( out int Description, int ReservedValue ); //Creating a function that uses the API function... public static bool IsConnectedToInternet( ) { int Desc ; return InternetGetConnectedState( out Desc, 0 ) ; } } 

O Microsoft Windows Vista e o 7 usam a técnica NCSI (Network Connectivity Indicator Indicator):

O NCSI executa uma pesquisa de DNS em http://www.msftncsi.com e, em seguida, solicita o endereço http://www.msftncsi.com/ncsi.txt . Este arquivo é um arquivo de texto simples e contém apenas o texto ‘Microsoft NCSI’. O NCSI envia uma solicitação de pesquisa de DNS para dns.msftncsi.com. Esse endereço DNS deve ser resolvido para 131.107.255.255. Se o endereço não corresponder, presume-se que a conexão com a Internet não esteja funcionando corretamente.

Você pode verificar se há uma conexão de rede usando isso no .NET 2.0+

 System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); 

Isso provavelmente retornará true para redes locais, portanto, pode não funcionar para você.

Esta é uma questão em que a resposta é realmente “depende”. Porque depende de por que você quer verificar e para que tipo de conectividade? Você quer ser capaz de acessar certos sites / serviços através de http? Enviar e-mail smtp? Fazer pesquisas de dns?

Usar uma combinação das respostas anteriores é provavelmente o caminho a percorrer – primeiro use a API wininet da resposta do colítio para verificar se existe uma conexão de qualquer tipo disponível.

Se estiver, tente algumas pesquisas de dns (consulte System.Net.Dns) para os resources nos quais você está interessado ou alguns grandes sites populares (google, altavista, compuserve, etc …).

Em seguida, você pode tentar executar ping (consulte a resposta de Roger Willcocks) e / ou estabelecer uma conexão de soquete para os mesmos sites. Observe que um ping com falha pode significar que as regras de firewall não permitem fazer ping.

Se você puder ser mais específico a respeito de porque deseja verificar, será mais fácil fornecer uma resposta que cubra suas necessidades …

aqui está a melhor solução que encontrei até agora:

 public static bool isConnected() { try { string myAddress = "www.google.com"; IPAddress[] addresslist = Dns.GetHostAddresses(myAddress); if (addresslist[0].ToString().Length > 6) { return true; } else return false; } catch { return false; } } 

uso:

 if(isConnected()) { //im connected to the internet } else { //not connected } 

A maneira mais fácil é provavelmente verificar se eles podem baixar um arquivo da web que você sabe que está disponível. Use o código a seguir para baixar a página do google.

 WebClient Client = new WebClient (); String Response; Response = Client.DownloadString("http://www.google.com"); 

Você provavelmente deve envolvê-lo em um Try …. Catch para capturar a exceção que é lançada quando não é possível estabelecer uma conexão.

Reconhecimento de rede no Windows XP

Reconhecimento de rede no Windows Vista e no Windows 7

É claro que isso não garante que o site que você planeja visitar não esteja bloqueado por regras de firewall cooperativas, a API está apenas verificando se um site pré-definido pode ser acessado .

Existem outras opções também.

A biblioteca InfoPath expõe o método “IsDestinationReachable” , que é um wrapper para o método Win API com o mesmo nome. (Parece que o Vista não suporta isso)

No entanto, acredito nos documentos que isso depende de algo como o PING, portanto, não necessariamente um bom teste.

Vista + dizem usar o “Gerenciador de lista de rede”

@colithium O Google pode não estar inativo, mas as coisas também podem falhar se o intervalo de lokup do DNS exceder o tempo limite. Não é raro em casa aqui na Nova Zelândia, a primeira tentativa falha, a segunda é bem-sucedida porque os dados se propagaram de volta para o DNS do ISP ou para o cache do roteador no momento em que a segunda solicitação é feita.

Como alternativa, você pode usar a pesquisa de DNS para verificar a conectividade com a Internet. Este método é mais rápido que o método Ping.

 public static bool DnsTest() { try { System.Net.IPHostEntry ipHe = System.Net.Dns.GetHostByName("www.google.com"); return true; } catch { return false; } }