Como faço para verificar se há uma conexão de rede?


Respostas:


153

Você pode verificar se há uma conexão de rede no .NET 2.0 usando GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Para monitorar as mudanças no endereço IP ou na disponibilidade da rede, use os eventos da classe NetworkChange :

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

9
Isso cuida da "disponibilidade limitada"?
tofutim

Isso nem sempre funciona no WPF. Alguns laptops retornam falsos e alguns retornam verdadeiros
Krilovich

Isso realmente funciona? Acabei de escrever esta linha e desligo meu roteador e ainda retorna verdadeiro!
Mushfiq de

1
NetworkInterface.GetIsNetworkAvailable()tem sido muito confiável em meu aplicativo (.NET 4.5, Windows 10), especialmente quando executado em uma máquina virtual. O tratamento dos eventos de NetworkAvailabilityChangedtem sido confiável.
eskimwier

Isso não é confiável. leia stackoverflow.com/a/25779403/2377343
T.Todua

174

A resposta marcada é 100% correta, entretanto, há certos casos em que o método padrão é enganado por cartões virtuais (caixa virtual, ...). Freqüentemente, também é desejável descartar algumas interfaces de rede com base em sua velocidade (portas seriais, modems, ...).

Aqui está um trecho de código que verifica esses casos:

    /// <summary>
    /// Indicates whether any network connection is available
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable()
    {
        return IsNetworkAvailable(0);
    }

    /// <summary>
    /// Indicates whether any network connection is available.
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable(long minimumSpeed)
    {
        if (!NetworkInterface.GetIsNetworkAvailable())
            return false;

        foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
        {
            // discard because of standard reasons
            if ((ni.OperationalStatus != OperationalStatus.Up) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
                continue;

            // this allow to filter modems, serial, etc.
            // I use 10000000 as a minimum speed for most cases
            if (ni.Speed < minimumSpeed)
                continue;

            // discard virtual cards (virtual box, virtual pc, etc.)
            if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
                (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
                continue;

            // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
            if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
                continue;

            return true;
        }
        return false;
    }

17
isso está correto e merece muitos votos positivos - descobri que o evento NetworkAvailabilityChanged mencionado na resposta aceita não é disparado de forma confiável, o que provavelmente é causado por adaptadores virtuais mencionados nesta resposta
Marek

1
+1 para a verificação adicional de máquinas virtuais. Apenas topei com este caso ontem. Mas ainda acho que isso não funciona com 'Hype-V', porque eles não têm 'virtual' no nome.
Herdo

3
@Herdo - sim, o código não é perfeito e não acho que possa haver algo perfeito em um mundo virtual. Mas você pode melhorar.
Simon Mourier,

@SimonMourier Você está certo. Só queria observar que, se alguém ainda retornar verdadeiro, se não houver conexão -> Isso pode ser um problema :)
Herdo

1
@noelicus - Em projetos em que tenho trabalhado até agora, implementei um sistema de monitoramento / pesquisa periódica (solicitações HTTP GET simples porque eu estava direcionando um servidor web) que gera eventos quando o servidor é detectado como "inativo" (não alcançável por HTTP) ou "up" (acessível novamente). No caso geral, você pode definir o que "confiável" significa no seu caso e implementar uma lógica semelhante.
Simon Mourier

9

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

  1. NCSI executa uma pesquisa DNS em www.msftncsi.com e, em seguida, solicita http://www.msftncsi.com/ncsi.txt . Este arquivo é um arquivo de texto simples e contém apenas o texto ' Microsoft NCSI '.
  2. NCSI envia uma solicitação de pesquisa de DNS para dns.msftncsi.com. Este endereço DNS deve resolver para 131.107.255.255. Se o endereço não for igual, presume-se que a conexão com a Internet não está funcionando corretamente.

3
Isso é ótimo, mas tecnicamente não é sobre a disponibilidade de uma 'rede', mas mais 'eu tenho conectividade com a Internet via http?' Você pode ter conexões de rede perfeitas, mas nenhuma conectividade com a Internet, por exemplo, em uma LAN independente. Consulte para obter mais informações sobre o NCSI: technet.microsoft.com/en-us/library/cc766017.aspx
MichielB

1

Chame este método para verificar a conexão de rede.

public static bool IsConnectedToInternet()
        {
            bool returnValue = false;
            try
            {

                int Desc;
                returnValue = Utility.InternetGetConnectedState(out Desc, 0);
            }
            catch
            {
                returnValue = false;
            }
            return returnValue;
        }

Coloque esta linha de código abaixo.

[DllImport("wininet.dll")]
        public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.