Quel est le moyen le plus rapide et le plus efficace de vérifier la connectivité Internet dans .NET?
c#
.net
internet-connection
Mohit Deshpande
la source
la source
Windows NLM API
devrait être le meilleur pour cela. stackoverflow.com/questions/5405895/…Réponses:
Quelque chose comme ça devrait fonctionner.
System.Net.WebClient
la source
I cannot image a world where www.google.com does not return some HTML
en Chine par exemple ...Il n'y a absolument aucun moyen de vérifier de manière fiable s'il y a une connexion Internet ou non (je suppose que vous voulez dire l'accès à Internet).
Vous pouvez cependant demander des ressources qui ne sont pratiquement jamais hors ligne, comme envoyer un ping à google.com ou quelque chose de similaire. Je pense que ce serait efficace.
la source
8.8.8.8
ou8.8.4.4
) fonctionne bien pour moi.Beware - many schools and offices block the ping protocol.
si vous utilisez cette méthode pour une application qui sera utilisée par les clients, je déconseille cette méthode de vérification d'InternetAu lieu de vérifier, effectuez simplement l'action (demande Web, courrier, ftp, etc.) et préparez-vous à l'échec de la demande, ce que vous devez faire de toute façon, même si votre vérification a réussi.
Considérer ce qui suit:
Si le réseau est en panne, votre action échouera aussi rapidement qu'un ping, etc.
la source
NetworkInterface.GetIsNetworkAvailable
est très peu fiable. Ayez juste une connexion VMware ou autre LAN et cela retournera un mauvais résultat. Aussi à propos de laDns.GetHostEntry
méthode, je voulais juste savoir si l'URL de test pouvait être bloquée dans l'environnement où mon application allait se déployer.Donc, une autre façon dont j'ai découvert est d'utiliser la
InternetGetConnectedState
méthode. Mon code estla source
Un test de connexion Internet en envoyant une requête ping à Google:
la source
Je ne suis pas d'accord avec les personnes qui déclarent: "Quel est l'intérêt de vérifier la connectivité avant d'effectuer une tâche, car immédiatement après le contrôle, la connexion peut être perdue". Certes, il existe un certain degré d'incertitude dans de nombreuses tâches de programmation que nous, en tant que développeurs, entreprenons, mais réduire l'incertitude à un niveau d'acceptation fait partie du défi.
J'ai récemment rencontré ce problème lors de la création d'une application incluant une fonction de mappage reliée à un serveur de tuiles en ligne. Cette fonctionnalité devait être désactivée en cas de manque de connectivité Internet.
Certaines des réponses sur cette page étaient très bonnes, mais ont cependant causé beaucoup de problèmes de performances tels que le blocage, principalement en cas d'absence de connectivité.
Voici la solution que j'ai fini par utiliser, avec l'aide de certaines de ces réponses et de mes collègues:
la source
J'ai vu toutes les options énumérées ci-dessus et la seule option viable pour vérifier si Internet est disponible ou non est l'option "Ping". L'importation
[DllImport("Wininet.dll")]
etSystem.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
ou toute autre variation de laNetworkInterface
classe ne fonctionne pas bien pour détecter la disponibilité du réseau. Ces méthodes vérifient uniquement si le câble réseau est branché ou non.L'option "Ping"
if
(La connexion est disponible) retournetrue
if
(La connexion n'est pas disponible et le câble réseau est branché) renvoiefalse
if
(Le câble réseau n'est pas branché)Throws an exception
L'interface réseau
if
(Internet est disponible) RetoursTrue
if
(Internet n'est pas disponible et le câble réseau est branché)True
if
(Le câble réseau n'est pas branché) renvoiefalse
Le [DllImport ("Wininet.dll")]
if
(Internet est disponible) RetoursTrue
if
(Internet n'est pas disponible et le câble réseau est branché)True
if
(Le câble réseau n'est pas branché) renvoiefalse
Donc, en cas de
[DllImport("Wininet.dll")]
etNetworkInterface
Il n'y a aucun moyen de savoir si une connexion Internet est disponible.la source
Ne résout pas le problème de panne de réseau entre la vérification et l'exécution de votre code mais est assez fiable
la source
Pinging google.com introduit une dépendance de résolution DNS. Pinging 8.8.8.8 est très bien, mais Google est à plusieurs sauts de moi. Tout ce que je dois faire est de cingler la chose la plus proche de moi qui est sur Internet.
Je peux utiliser la fonction TTL de Ping pour envoyer un ping au hop # 1, puis au hop # 2, etc., jusqu'à ce que j'obtienne une réponse de quelque chose qui se trouve sur une adresse routable; si ce nœud se trouve sur une adresse routable, il est sur Internet. Pour la plupart d'entre nous, le saut n ° 1 sera notre passerelle / routeur local et le saut n ° 2 sera le premier point de l'autre côté de notre connexion fibre ou autre.
Ce code fonctionne pour moi et répond plus rapidement que certaines des autres suggestions de ce fil, car il envoie une requête ping à ce qui est le plus proche de moi sur Internet.
la source
Voici comment il est implémenté dans Android.
Comme preuve de concept, j'ai traduit ce code en C #:
la source
la source
Une autre option est l'API Network List Manager qui est disponible pour Vista et Windows 7. Article MSDN ici . Dans l'article se trouve un lien pour télécharger des exemples de code qui vous permettent de faire ceci:
Assurez-vous d'ajouter une référence à la bibliothèque de types de la liste de réseaux 1.0 dans l'onglet COM ... qui apparaîtra comme NETWORKLIST.
la source
Essayez d'éviter de tester les connexions en interceptant l'exception. car nous nous attendons vraiment à ce que parfois nous perdions la connexion réseau.
la source
Si vous souhaitez informer l'utilisateur / prendre des mesures chaque fois qu'un changement de réseau / connexion se produit.
Utilisez l'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
la source
Personnellement , je trouve le mieux la réponse d' Anton et de moffeltje , mais j'ai ajouté une vérification pour exclure les réseaux virtuels mis en place par VMWare et d'autres.
la source
la source
bb
serait toujours vrai même lorsque le réseau n'est pas connecté à Internet.Version multi-thread de ping:
la source
Je ne pense pas que ce soit impossible, mais pas simple.
J'ai construit quelque chose comme ça, et oui ce n'est pas parfait, mais la première étape est essentielle: vérifier s'il y a une connectivité réseau. L'API Windows ne fait pas un excellent travail, alors pourquoi ne pas faire un meilleur travail?
C'est assez simple, mais cela aide vraiment à améliorer la qualité de la vérification, surtout lorsque vous souhaitez vérifier diverses configurations de proxy.
Alors:
la source
la source
Utilisez NetworkMonitor pour surveiller l'état du réseau et la connexion Internet.
Échantillon:
la source
introduction
Dans certains scénarios, vous devez vérifier si Internet est disponible ou non en utilisant le code C # dans les applications Windows. Il peut s'agir de télécharger ou de télécharger un fichier via Internet sous Windows ou d'obtenir des données d'une base de données distante, dans ces situations, la vérification d'Internet est obligatoire.
Il existe plusieurs façons de vérifier la disponibilité d'Internet en utilisant C # à partir du code derrière. Toutes ces méthodes sont expliquées ici, y compris leurs limites.
L'API 'wininet' peut être utilisée pour vérifier si le système local a une connexion Internet active ou non. L'espace de noms utilisé pour cela est «System.Runtime.InteropServices» et importez la dll «wininet.dll» à l'aide de DllImport. Après cela, créez une variable booléenne avec statique externe avec un nom de fonction InternetGetConnectedState avec une description de deux paramètres et réservéValue comme indiqué dans l'exemple.
Remarque: Le modificateur extern est utilisé pour déclarer une méthode implémentée en externe. Une utilisation courante du modificateur extern est avec l'attribut DllImport lorsque vous utilisez des services Interop pour appeler du code non managé. Dans ce cas, la méthode doit également être déclarée comme statique.
L'exemple suivant utilise la méthode GetIsNetworkAvailable pour déterminer si une connexion réseau est disponible.
Remarques (selon MSDN): Une connexion réseau est considérée comme disponible si une interface réseau est marquée "up" et n'est pas une interface de bouclage ou de tunnel.
Il existe de nombreux cas dans lesquels un périphérique ou un ordinateur n'est pas connecté à un réseau utile mais est toujours considéré comme disponible et GetIsNetworkAvailable renvoie true. Par exemple, si le périphérique exécutant l'application est connecté à un réseau sans fil qui nécessite un proxy, mais que le proxy n'est pas défini, GetIsNetworkAvailable renvoie true. Un autre exemple de moment où GetIsNetworkAvailable retournera true est si l'application s'exécute sur un ordinateur connecté à un concentrateur ou un routeur où le concentrateur ou le routeur a perdu la connexion en amont.
Les classes Ping et PingR répondre permettent à une application de déterminer si un ordinateur distant est accessible sur le réseau en obtenant une réponse de l'hôte. Ces classes sont disponibles dans l'espace de noms System.Net.NetworkInformation. L'exemple suivant montre comment envoyer une requête ping à un hôte.
Remarques (selon MSDN): les applications utilisent la classe Ping pour détecter si un ordinateur distant est accessible. La topologie du réseau peut déterminer si Ping peut contacter avec succès un hôte distant. La présence et la configuration de proxys, d'équipements de traduction d'adresses réseau (NAT) ou de pare-feu peuvent empêcher Ping de réussir. Un ping réussi indique uniquement que l'hôte distant peut être atteint sur le réseau; la présence de services de niveau supérieur (comme un serveur Web) sur l'hôte distant n'est pas garantie.
Les commentaires / suggestions sont invités. Bon codage ......!
la source
Pour mon application, nous testons également en téléchargeant un petit fichier.
Aussi. Certains FAI peuvent utiliser un serveur intermédiaire pour mettre en cache le fichier. Ajouter un paramètre aléatoire inutilisé, par exemple. https://www.microsoft.com/favicon.ico?req=random_number Peut empêcher la mise en cache.
la source
J'ai un problème avec cette méthode sur mon routeur / modem 3G, car si Internet est déconnecté, le routeur redirige la page vers sa page de réponse, donc vous obtenez toujours une vapeur et votre code pense qu'il y a Internet. Les pommes (ou autres) ont une page de détection de points chauds qui renvoie toujours une certaine réponse. L'exemple suivant renvoie la réponse «Succès». Vous serez donc exactement sûr de pouvoir vous connecter à Internet et obtenir une réponse réelle!
la source
J'ai trois tests pour une connexion Internet.
System.Net
etSystem.Net.Sockets
Test 1
Test 2
Test 3
Réalisation des tests
Si vous faites un
Dictionary
deString
etBoolean
appeléCheckList
, vous pouvez ajouter les résultats de chaque testCheckList
.Maintenant, récapitulez à travers chacun en
KeyValuePair
utilisant unefor...each
boucle.Si
CheckList
contient unValue
detrue
, alors vous savez qu'il existe une connexion Internet.la source
Ça marche
la source