Checar se a conexão com a internet está ativa

Eu desenvolvi uma aplicação onde necessitava verificar a conexão com a internet, se estava ativa ou não, caso contrário a aplicação iria parar.Para verificar se a conexão com a internet está ativa podemos usar a API InternetGetConnectedState. Mais informações sobre a API e o parâmetro “Description” em
http://msdn.microsoft.com/en-us/library/aa384702(VS.85).aspx

Usando API:

[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

/// <summary>
/// verificar se está conectado à internet
/// </summary>
/// <returns>true se existir uma conexão</returns>
/// <remarks>retornar true não quer dizer que o destino esteja alcançável, utilize
/// IsReachable(url) para saber se o destino está alcançável</remarks>
public static bool IsConnectedToInternet()
{
	int Desc;
	bool ret = InternetGetConnectedState(out Desc, 0);
	return ret;
}

Mas neste caso se o método retornar true, isso não quer dizer que realmente podemos acessar o endereço web que precisamos. Por exemplo: Podemos estar conectados por um servidor proxy, onde precisamos fazer uma autenticação.

Neste caso temos que validar se nosso destino está alcançável, acessível.
Veja como:

/// <summary>
/// verifica se o destino informado está alcançável. (Acessível)
/// </summary>
/// <param name="_url">endereço URL</param>
/// <returns>true se estiver alcançável</returns>
public static bool IsReachable(string _url)
{
	System.Uri Url = new System.Uri(_url);

	System.Net.WebRequest webReq;
	System.Net.WebResponse resp;
	webReq = System.Net.WebRequest.Create(Url);

	try
	{
		resp = webReq.GetResponse();
		resp.Close();
		webReq = null;
		return true;
	}
	catch
	{
		webReq = null;
		return false;
	}
}

Se este método retornar true, aí sim podemos dizer que nossa aplicação tem acesso a internet.
Veja um exemplo em uma aplicação console.

static void Main(string[] args)
{
	if (IsConnectedToInternet())
	{
		Console.WriteLine("Conectado a internet");

		//mas...
		//estarmos conectado não quer dizer que podemos acessar o endereço que desejamos
		//para isto temos que validar se nosso destino é alcançável.
		if (IsReachable("http://desenvolvedores.net"))
			Console.WriteLine("temos acesso ao site http://desenvolvedores.net");
		else
			Console.WriteLine("não temos acesso ao site http://desenvolvedores.net");
	}
	else
		Console.WriteLine("Não está conectado a internet");

	Console.ReadKey();
}

Você poderia modificar a rotina IsConnectedToInternet e nela mesmo já validar se a conexão realmente está ativa. Para isso pode se usar um site que você tem certeza que estará sempre online. (Google, Microsoft, Desenvolvedores.net).

Veja a nova versão.

/// <summary>
/// verificar se está conectado a internet
/// </summary>
/// <returns>true se existir uma conexão</returns>
/// <remarks>retornar  true não quer dizer que o destino esteja alcançável, utilize
/// IsReachable(url) para saber se o destino está alcançável</remarks>
public static bool IsConnectedToInternet()
{
	int Desc;
	bool ret = InternetGetConnectedState(out Desc, 0);

	if (ret)
		ret = IsReachable("http://desenvolvedores.net");

	return ret;
}

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil.
Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software.
Para saber mais ... http://desenvolvedores.net/marcelo
[]'s

Você vai gostar de...

Postagens populares.

1 Comment

  1. Se um site está bloqueado pelo firewall porém responde ao ping este método acusa acessível.. =(

Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.