Qual é a maneira mais rápida e eficiente de verificar a conectividade da Internet no .NET?
c#
.net
internet-connection
Mohit Deshpande
fonte
fonte
Windows NLM API
deve ser o melhor para isso. stackoverflow.com/questions/5405895/…Respostas:
Algo assim deve funcionar.
System.Net.WebClient
fonte
I cannot image a world where www.google.com does not return some HTML
na China, por exemplo ...Não há absolutamente nenhuma maneira que você pode confiavelmente verificar com se há ou não uma conexão à Internet (suponho que você queira dizer acesso à internet).
No entanto, você pode solicitar recursos que nunca estão offline, como pingar google.com ou algo semelhante. Eu acho que isso seria eficiente.
fonte
8.8.8.8
ou8.8.4.4
) funciona bem para mim.Beware - many schools and offices block the ping protocol.
se você estiver usando este método para um aplicativo que será usado por clientes gostaria de aconselhar contra este método de verificação internetEm vez de verificar, basta executar a ação (solicitação da web, email, ftp etc.) e estar preparado para a solicitação falhar, o que você deve fazer de qualquer maneira, mesmo que sua verificação tenha sido bem-sucedida.
Considere o seguinte:
Se a rede estiver inativa, sua ação falhará tão rapidamente quanto um ping, etc.
fonte
NetworkInterface.GetIsNetworkAvailable
é muito confiável. Basta ter alguma conexão VMware ou outra LAN e ele retornará um resultado errado. Também sobre oDns.GetHostEntry
método, eu estava preocupado apenas com o fato de o URL de teste estar bloqueado no ambiente em que meu aplicativo será implantado.Então, outra maneira que eu descobri é usando o
InternetGetConnectedState
método Meu código éfonte
Um teste para conexão à Internet executando ping no Google:
fonte
Discordo das pessoas que afirmam: "Qual é o sentido de verificar a conectividade antes de executar uma tarefa, pois imediatamente após a verificação, a conexão pode ser perdida". Certamente, há um certo grau de incerteza em muitas tarefas de programação que nós, como desenvolvedores, realizamos, mas reduzir a incerteza a um nível de aceitação faz parte do desafio.
Recentemente, me deparei com esse problema ao criar um aplicativo que inclui um recurso de mapeamento vinculado a um servidor de blocos on-line. Essa funcionalidade era para ser desativada quando uma falta de conectividade com a Internet era observada.
Algumas das respostas nesta página foram muito boas, mas causaram muitos problemas de desempenho, como interrupções, principalmente no caso de ausência de conectividade.
Aqui está a solução que acabei usando, com a ajuda de algumas dessas respostas e de meus colegas:
fonte
Eu vi todas as opções listadas acima e a única opção viável para verificar se a Internet está disponível ou não é a opção "Ping". A importação
[DllImport("Wininet.dll")]
e /System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
ou qualquer outra variação daNetworkInterface
classe não funciona bem na detecção da disponibilidade da rede. Esses métodos só verificam se o cabo de rede está conectado ou não.A "opção Ping"
if
(Conexão disponível) retornatrue
if
(A conexão não está disponível e o cabo de rede está conectado) retornafalse
if
(O cabo de rede não está conectado)Throws an exception
O NetworkInterface
if
(Internet está disponível)True
if
(A Internet não está disponível e o cabo de rede está conectado)True
if
(O cabo de rede não está conectado) retornafalse
O [DllImport ("Wininet.dll")]
if
(Internet está disponível)True
if
(A Internet não está disponível e o cabo de rede está conectado)True
if
(O cabo de rede não está conectado) retornafalse
Portanto, no caso de
[DllImport("Wininet.dll")]
eNetworkInterface
Não há como saber se a conexão à Internet está disponível.fonte
Não resolve o problema de queda de rede entre verificar e executar seu código, mas é razoavelmente confiável
fonte
O ping do google.com introduz uma dependência de resolução de DNS. O ping 8.8.8.8 está bom, mas o Google está a vários passos de mim. Tudo o que preciso fazer é executar ping na coisa mais próxima de mim que está na internet.
Eu posso usar o recurso TTL do Ping para executar o ping no salto 1, depois o salto 2, etc., até obter uma resposta de algo que esteja em um endereço roteável; se esse nó estiver em um endereço roteável, estará na internet. Para a maioria de nós, o salto número 1 será nosso gateway / roteador local e o salto número 2 será o primeiro ponto do outro lado da nossa conexão de fibra óptica ou qualquer outra coisa.
Esse código funciona para mim e responde mais rapidamente do que algumas das outras sugestões deste segmento, porque está executando o ping do que estiver mais próximo de mim na internet.
fonte
Veja como isso é implementado no Android.
Como prova de conceito, traduzi esse código para C #:
fonte
fonte
Outra opção é a API do Network List Manager, disponível para o Vista e Windows 7. Artigo MSDN aqui . No artigo, há um link para baixar exemplos de códigos que permitem fazer isso:
Certifique-se de adicionar uma referência à Biblioteca de tipos da lista de rede 1.0 na guia COM ... que será exibida como NETWORKLIST.
fonte
Tente evitar o teste de conexões capturando a exceção. porque realmente esperamos que, às vezes, possamos perder a conexão de rede.
fonte
Se você deseja notificar o usuário / executar uma ação sempre que ocorrer uma alteração na rede / conexão.
Use a API NLM:
https://msdn.microsoft.com/en-us/library/ee264321.aspx
http://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of
fonte
Pessoalmente, acho melhor a resposta de Anton e moffeltje , mas adicionei uma verificação para excluir redes virtuais configuradas pelo VMWare e outros.
fonte
fonte
bb
ainda seria verdade mesmo quando a rede não estiver conectada à Internet.Versão multiencadeada do ping:
fonte
Eu não acho que é impossível, apenas não é direto.
Eu criei algo assim, e sim, não é perfeito, mas o primeiro passo é essencial: verificar se há alguma conectividade de rede. A API do Windows não faz um ótimo trabalho, então por que não fazer um trabalho melhor?
É bem simples, mas realmente ajuda a melhorar a qualidade da verificação, especialmente quando você deseja verificar várias configurações de proxy.
Assim:
fonte
fonte
Use o NetworkMonitor para monitorar o estado da rede e a conexão à Internet.
Amostra:
fonte
Introdução
Em alguns cenários, é necessário verificar se a Internet está disponível ou não usando o código C # nos aplicativos Windows. Pode ser fazer o download ou upload de um arquivo usando a Internet no Windows Forms ou obter alguns dados do banco de dados que está em local remoto, nessas situações, a verificação da Internet é obrigatória.
Existem algumas maneiras de verificar a disponibilidade da Internet usando C # do código atrás. Todas essas formas são explicadas aqui, incluindo suas limitações.
A API 'wininet' pode ser usada para verificar se o sistema local tem conexão ativa com a Internet ou não. O espaço para nome usado para isso é 'System.Runtime.InteropServices' e importa a dll 'wininet.dll' usando DllImport. Depois disso, crie uma variável booleana com estática externa com um nome de função InternetGetConnectedState com a descrição de dois parâmetros e o valor reservado, conforme mostrado no exemplo.
Nota: O modificador externo é usado para declarar um método implementado externamente. Um uso comum do modificador externo é com o atributo DllImport quando você está usando os serviços de interoperabilidade para chamar código não gerenciado. Nesse caso, o método também deve ser declarado como estático.
O exemplo a seguir usa o método GetIsNetworkAvailable para determinar se uma conexão de rede está disponível.
Comentários (Conforme MSDN): Uma conexão de rede é considerada disponível se qualquer interface de rede estiver marcada como "ativa" e não for uma interface de loopback ou túnel.
Existem muitos casos em que um dispositivo ou computador não está conectado a uma rede útil, mas ainda é considerado disponível e GetIsNetworkAvailable retornará true. Por exemplo, se o dispositivo que está executando o aplicativo estiver conectado a uma rede sem fio que requer um proxy, mas o proxy não estiver definido, GetIsNetworkAvailable retornará true. Outro exemplo de quando GetIsNetworkAvailable retornará true é se o aplicativo estiver sendo executado em um computador conectado a um hub ou roteador em que o hub ou roteador perdeu a conexão upstream.
As classes Ping e PingReply permitem que um aplicativo determine se um computador remoto está acessível pela rede, obtendo resposta do host. Essas classes estão disponíveis no espaço para nome System.Net.NetworkInformation. O exemplo a seguir mostra como executar ping em um host.
Comentários (Conforme o MSDN): Os aplicativos usam a classe Ping para detectar se um computador remoto está acessível. A topologia de rede pode determinar se o Ping pode entrar em contato com êxito com um host remoto. A presença e configuração de proxies, equipamentos de conversão de endereços de rede (NAT) ou firewalls podem impedir o êxito do ping. Um ping bem-sucedido indica apenas que o host remoto pode ser acessado na rede; a presença de serviços de nível superior (como um servidor da Web) no host remoto não é garantida.
Comentários / sugestões são convidados. Feliz codificação ......!
fonte
Para minha aplicação, também testamos o download de um arquivo minúsculo.
Além disso. Alguns ISP podem usar o servidor intermediário para armazenar em cache o arquivo. Adicione um parâmetro aleatório não utilizado, por exemplo. https://www.microsoft.com/favicon.ico?req=random_number Pode impedir o cache.
fonte
Estou tendo problemas com esse método no meu roteador / modem 3G, porque se a Internet for desconectada, o roteador redireciona a página para sua página de resposta, para que você ainda receba um vapor e seu código pense que existe internet. Maçãs (ou outras) têm uma página de dedução de hot spot que sempre retorna uma certa resposta. O exemplo a seguir retorna a resposta "Sucesso". Assim, você terá exatamente certeza de que poderá conectar a Internet e obter uma resposta real!
fonte
Eu tenho três testes para uma conexão com a Internet.
System.Net
eSystem.Net.Sockets
Teste 1
Teste 2
Teste 3
Executando os testes
Se você fizer um
Dictionary
deString
eBoolean
chamarCheckList
, poderá adicionar os resultados de cada teste aoCheckList
.Agora, recorra a cada
KeyValuePair
um usando umfor...each
loop.Se
CheckList
contiver umValue
detrue
, você saberá que há uma conexão com a Internet.fonte
Isso funciona
fonte